OnTouchListener()の動作が良く分かっていなかった。
なのでActivityのLayoutビューにOnTouchListener()を設置してGestureDetectorCompatへ横流しをしていた。
何となくMotionEventの流れが末端のビューからActivity(親)まで遡って来るのをイメージできた。
OnTouchListener()の設置場所はFragmentのビューで良いらしい。
fragment_main.xml に View を書いて findViewById().setOnTouchListener()でMotionEventをフック。
return true; でイベント消費すれば、不本意な動作は抑制できそう。
public class MainFragment extends Fragment {
// 省略
private GestureDetectorCompat mDetector;
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
// 省略
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 省略
mDetector = new GestureDetectorCompat( requireContext(), new MyGestureListener() );
// fragment_main.xml の id にOnTouchListener を設定して mDetector.onTouchEvent()を呼ぶ。
requireActivity().findViewById(R.id.ui_mainFragment).setOnTouchListener(
new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return mDetector.onTouchEvent(event);
}
}
);
// 省略
}
}