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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1796閲覧

onItemClickでGestureDitectorが反応しない

trearius

総合スコア6

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/12/13 04:41

フラグメント上でViewPagerを使用しています。
ViewPagerにGridViewをセットしてonItemClickで日付を選択できるようなカレンダーを作成しました、そこでGoogleのカレンダーのようにフリックで大きさを変えることができるようにするため、GestureDitectorを使用したいのですがsetOnTouchListenerが反応しない状態です。

Java

1public class CalendarFragment extends Fragment { 2 3private CalendarAdapter mCalendarAdapter; 4 5 public View onCreateView(LayoutInflater inflater, ViewGroup container, 6 Bundle savedInstanceState) { 7 calendarGridView = rootview.findViewById(R.id.calendarGridView); 8 mCalendarAdapter = new CalendarAdapter(getContext(),calendarGridView); 9 calendarGridView.setAdapter(mCalendarAdapter); 10 mCalendarAdapter.MoveMonthbyIndex(index); 11 tvTitle.setText(mCalendarAdapter.getTitle()); 12 13 //カレンダー上のセルをクリックしたときのイベント 14 calendarGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 15 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 16 17 ...処理 18} 19 20 21 }); 22

Java

1public class CalFragment extends Fragment { 2private GestureDetectorCompat mDetector; 3 4public View onCreateView(@NonNull LayoutInflater inflater, 5 ViewGroup container, Bundle savedInstanceState) { 6 7mDetector = new GestureDetectorCompat(getContext(), new MyGestureListener()); 8 9 View view = inflater.inflate(R.layout.fragment_cal, container, false); 10 //ViewPager 11 v = view.findViewById(R.id.CalendarPager); 12 v.setOnTouchListener(new View.OnTouchListener() { 13 @Override 14 public boolean onTouch(View v, MotionEvent event) { 15 mDetector.onTouchEvent(event); 16 return false; 17 } 18 }); 19} 20 class MyGestureListener extends GestureDetector.SimpleOnGestureListener { 21 22 23 @Override 24 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 25 26 float dx = e1.getX() - e2.getX(); 27 float dy = e1.getY() - e2.getY(); 28 if (Math.abs(dy) > Math.abs(dx)) { 29 if (dy > 0) { 30 // 上方向フリック 31 mListener.animeup(); 32 } else if (dy < 0) { 33 // 下方向フリック 34 mListener.animedown(); 35 } 36 37 } 38 return false; 39 } 40 41 42 43 } 44}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ViewGroupの子Viewでタッチイベントの処理をした場合、ViewGroup側のonTouchEvent(OnTouchListener)は呼び出されません。代わりにonInterceptTouchEventを実装すればViewGroupでもタッチイベントを処理できます。
ドキュメント

java

1@Override 2public boolean onInterceptTouchEvent(MotionEvent event) { 3 mDetector.onTouchEvent(event); 4 return super.onInterceptTouchEvent(event); 5}

ViewGroupを継承したクラスを用意したくない場合は、CoordinatorLayout.Behaviorを使うという方法もあります。CoordinatorLayoutでViewGroupを囲んで、ViewGroupにはonInterceptTouchEventを実装したCoordinatorLayout.Behaviorを設定すればOKです。

java

1CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) v.getLayoutParams(); 2lp.setBehavior(new CoordinatorLayout.Behavior() { 3 @Override 4 public boolean onInterceptTouchEvent(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull MotionEvent ev) { 5 if (child == v) mDetector.onTouchEvent(ev); 6 return super.onInterceptTouchEvent(parent, child, ev); 7 } 8});

追記

GridViewはスクロールのジェスチャーを検出すると、親ViewGroupのonInterceptTouchEventを呼ばれなくするメソッド(requestDisallowInterceptTouchEvent)を呼んでしまいます。これを回避するにはGridViewのスクロール処理が発生しないようにする必要がありますが、それ用のAPIは用意されていないようなので以下のようにACTION_MOVEのタッチイベントを奪うことで対応できます。

java

1// ACTION_MOVEのタッチイベントをGridViewに渡さないようにする 2gridView.setOnTouchListener((v, event) -> 3 event.getAction() == MotionEvent.ACTION_MOVE 4);

投稿2019/12/14 01:09

編集2019/12/19 13:15
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trearius

2019/12/17 08:06

回答ありがとうございます! GridViewを使用しないViewPagerでは反応するようにはなったのですが GridViewを使用すると反応しなくなるのは何故でしょうか、、 デバッグモード等で色々試行錯誤してみたのですが GridViewを使用してるほうのViewPagerではMotionEventのaction_upが返ってきていないようなのです、DownとMoveは返ってきているのでup時にキャンセルか何かされているようなのですがさせない方法はありますでしょうか? 分かりにくくて申し訳ないのですが、、、
kakajika

2019/12/19 13:04

そうでした、GridViewの場合はスクロールするのでそれについての考慮も必要でした。詳しくは回答の方に追記します。
trearius

2019/12/20 06:38

ありがとうございます!おかげさまでやりたいことが実現できました! まだまだ知識不足で覚えることだらけです;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問