フラグメントで SimpleOnGestureListener を使いたい。
前回、onTouch()をアクティビティからフラグメントに引っ張った。
その MotionEvent を SimpleOnGestureListener に渡す。ちょっと回りくどいけど。
【MainActivity.java】
【MyMainData.java】
【MainViewModel.java】は前回のまま。
【MainFragment.java】
public class MainFragment extends Fragment implements View.OnTouchListener {
private MainViewModel mViewModel;
// 追加部分
private GestureDetectorCompat mDetector = null;
class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
// 一部省略
@Override
public boolean onDown(MotionEvent event) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
mViewModel.getPathName().setValue("SingleTap");
return true;
}
}
// ------
public static MainFragment newInstance(String path) {
MainFragment mainFragment = new MainFragment();// インスタンス生成
Bundle args = new Bundle();// Bundle にパラメータを設定
args.putString("test", path);
mainFragment.setArguments(args);
return mainFragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@SuppressLint({"FragmentLiveDataObserve", "UseRequireInsteadOfGet"})
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 追加。GestureDetectorのインスタンス化
mDetector = new GestureDetectorCompat(requireContext(), new MyGestureListener());
mViewModel = new ViewModelProvider((ViewModelStoreOwner) requireContext()).get(MainViewModel.class);
//lambda
final Observer< String> nameObserver = newName -> {
TextView text = view.findViewById(R.id.message);
text.setText(newName);
};
mViewModel.getPathName().observe((LifecycleOwner) requireContext(), nameObserver);
Bundle args = getArguments();// Bundle にパラメータを取得
if(args != null ){
String path = args.getString("test");
mViewModel.getPathName().setValue(path);
}
final Observer< String> dataObserver = newName -> {
TextView text = view.findViewById(R.id.message);
text.setText(newName);
};
mViewModel.getMainData().getTextData1().observe(requireActivity(), dataObserver);
mViewModel.getMainData().getTextData1().setValue("live data 1");
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
return mDetector.onTouchEvent(event); // GestureDetectorへMotionEventを渡している
}
}
mDetector = new GestureDetectorCompat(requireContext(), new MyGestureListener());
GestureDetectorをインスタンス化して、
mDetector.onTouchEvent(event)で
MotionEventを GestureDetectorに渡している。
前回と同じにタップすると表示が変わる。
データ参照と更新は行われている。
とりあえず、エラーは出ない。
また、画像表示は先延ばし^^;