質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

[Android Studio] TouchEventを実装できない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 363

Shibou

score 8

カレンダーアプリを制作をしており、
日付を表示しているTextViewをタッチして背景色を変えようとしているのですが、
View.OnTouchListenerを実装しても反応しません。
どこが間違っているのかわからないので、ご教授いただければ幸いです。

package com.example.calendar;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TableRow;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    //CalendarMaker
    CalendarMaker calendarMaker;
    //日付のID
    int[][]dateIdies ={
            {R.id.one_one,R.id.one_two,R.id.one_three,R.id.one_four,R.id.one_five,R.id.one_six,R.id.one_seven},
            {R.id.two_one,R.id.two_two,R.id.two_three,R.id.two_four,R.id.two_five,R.id.two_six,R.id.two_seven},
            {R.id.three_one,R.id.three_two,R.id.three_three,R.id.three_four,R.id.three_five,R.id.three_six,R.id.three_seven},
            {R.id.four_one,R.id.four_two,R.id.four_three,R.id.four_four,R.id.four_five,R.id.four_six,R.id.four_seven},
            {R.id.five_one,R.id.five_two,R.id.five_three,R.id.five_four,R.id.five_five,R.id.five_six,R.id.five_seven},
            {R.id.six_one,R.id.six_two,R.id.six_three,R.id.six_four,R.id.six_five,R.id.six_six,R.id.six_seven},
    };
    //日付情報を格納するList
    List<String> dateList = null;

    //今日の日付の背景情報を保存
    int todayID = 0; //背景を変えたTextViewのID
    Drawable todayDrawable = null; //元の背景

    //選択された日付の背景情報を保存
    int chooseID = 0;
    Drawable chooseDrawable = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //CalendarMakerの生成
        calendarMaker = new CalendarMaker();
        //カレンダーを生成
        this.createCalendar();
    }
    //次月へ移動するボタン
    public void onNext(View v){
        //月を進める
        calendarMaker.nextMonth();
        //カレンダーを生成
        createCalendar();
    }
    //先月へ移動するボタン
    public void onPrevious(View v){
        //月を戻す
        calendarMaker.previousMonth();
        //カレンダーを生成
        createCalendar();
    }
    //カレンダーを組み立てるメソッド
    private void createCalendar(){
        dateList = calendarMaker.getList();
        //背景を変えていたTextViewがある場合
        if(this.todayID != 0 && this.todayDrawable != null){
            TextView textView = ((TextView)findViewById(this.todayID));
            textView.setBackground(todayDrawable);
        }
        //List要素取り出しようカウント
        int count = 0;
        //表示する月に今日の日付があるか
        boolean haveToday = calendarMaker.haveToday();
        for(int i = 0;i < 6;i++){
            for(int j = 0; j < 7;j++){
                //日付のTextViewを生成
                TextView textView = ((TextView)findViewById(dateIdies[i][j]));
                textView.setText(dateList.get(count)); //日付情報を格納する
                //今日の日付の背景を変える
                if(haveToday && textView.getText().
                        toString().equals(String.valueOf(calendarMaker.getToday()))){
                    //背景を変えるTextViewのidを保存
                    this.todayID = textView.getId();
                    //元の色を保存
                    this.todayDrawable = textView.getBackground();
                    //背景の色を変える
                    textView.setBackgroundColor(Color.RED);
                    //タッチイベントの設定
                    textView.setOnTouchListener(this);
                }
                //6週目の日曜日を設定した場合
                if(i == 5 && j == 0 ){
                    TableRow tableRow = ((TableRow)findViewById(R.id.lastWeek));
                    //6週目の日曜日が空欄ならば
                    if(textView.getText().toString().equals("")){
                        //6週目を不可視にする
                        tableRow.setVisibility(View.GONE);
                    }else{
                        //6週目を可視化する
                        tableRow.setVisibility(View.VISIBLE);
                    }
                }
                count++;
            }
        }
        //表示する年月をセット
        ((TextView)findViewById(R.id.display_year_month)).setText(calendarMaker.toString());
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                //選択したviewのidと背景を保存する
                this.chooseID = v.getId();
                this.chooseDrawable = v.getBackground();
                //選択したviewの背景を変える
                v.setBackgroundColor(Color.BLACK);
                return true;
        }
        return false;
    }
}


```java
package com.example.calendar;

import java.util.ArrayList;
import java.util.Calendar;

public class CalendarMaker {
private Calendar calendar = null;

//現在の日付
private int nowYear = 0; //年
private int nowMonth = 0; //月
private int nowDay = 0; //日

//表示するカレンダーの年月
private int displayYear = 0; //年
private int displayMonth = 0; //月

//表示するカレンダーの必要情報
private int firstWeeks = 0; //月初めの曜日
private int lastDay = 0; //月の最終日
//表示用のフォーマット
private final String DISPLAY_FORMAT = "%04d年%02d月";
//コンストラクタ
public CalendarMaker(){
//現在日時の取得
calendar = Calendar.getInstance();
//現在日時のセット
this.nowYear = calendar.get(Calendar.YEAR);
this.nowMonth = calendar.get(Calendar.MONTH);
this.nowDay = calendar.get(Calendar.DATE);
//表示年月をセット
this.displayYear = this.nowYear; //表示年
this.displayMonth = this.nowMonth; //表示月
//カレンダー生成の必要情報を取得
this.getNeccessary();
}
//日付情報を格納したListを生成して返すメソッド
public ArrayList<String> getList(){
ArrayList<String>list = new ArrayList<>();
int dateCount = 1; //格納する日
//1週目を作成
for(int i = 1; i <= 7; i++){
if(i < this.firstWeeks){
list.add(""); //空白を入れる
}else{
list.add(String.valueOf(dateCount)); //日付を入れる
dateCount++; //日付のカウントを進める
}
}
//2週目以降を埋める
for(int j = 8; j <= 42; j++){
//最終日まで日付を格納していない場合
if(dateCount <= lastDay){
list.add(String.valueOf(dateCount));
dateCount++;
}else{
list.add("");
}
}
//42の日付情報を格納したListを返す
return list;
}
//表示する年月を生成して渡す
public String toString(){
return String.format(DISPLAY_FORMAT,displayYear,displayMonth+1);
}

//月をひとつ進める
public void nextMonth(){
this.displayMonth++;
//月を進めて年をまたいだ場合
if(displayMonth > 11){
this.displayMonth = 0; //月を1月にセット
this.displayYear++; //年を一つ進める
}
//必要情報の更新
this.getNeccessary();
}
//月を一つ戻す
public void previousMonth(){
this.displayMonth--;
//月を戻して年をまたいだ場合
if(displayMonth < 0){
this.displayMonth = 11;
this.displayYear--;
}
//必要情報の更新
this.getNeccessary();
}
//表示されている月に本日の日付が含まれるか否か
public boolean haveToday(){
boolean doYouHave = false;
if(this.nowYear == this.displayYear && this.nowMonth == this.displayMonth){
doYouHave = true;
}
return doYouHave;
}
//今日の日付を返す
public int getToday(){
return this.nowDay;
}
//月初めの曜日を取得
private void getFirstWeeks(){
calendar.set(displayYear,displayMonth,1); //表示年月の初日にセット
this.firstWeeks = calendar.get(Calendar.DAY_OF_WEEK);
}
//月末の日にちを取得
private void getLastDay(){
calendar.add(Calendar.MONTH,1);
calendar.add(Calendar.DATE,-1);
this.lastDay = calendar.get(Calendar.DATE);
}
//必要情報の取得メソッド
private void getNeccessary(){
this.getFirstWeeks();
this.getLastDay();
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hoshi-takanori

    2020/04/23 17:01

    今日の日付の場合のみ setOnTouchListener してるようですが、今日の日付をタッチしても反応がないのでしょうか? また、OnTouch よりも OnClick の方が適切な気がします。

    キャンセル

  • keicha_hrs

    2020/04/23 17:04

    setOnTouchListener()がfor文の中に存在するようですが、これによるイベントが発生しないという質問なのでしょうか?Android Studioのデバッグ機能などを用いて、このsetOnTouchListener()の行には間違いなく到達していることは確認されていますか?

    キャンセル

  • Shibou

    2020/04/23 17:11

    間違って今日の日付のみに設定していたようです...。
    OnClickにして修正します。ありがとうございましたm(__)m

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る