goo blog サービス終了のお知らせ 

タブレット用プログラムの書き止め

android OS & iPadOS の記録。

Fragment+ViewModel [基礎] GestureDetectorの組み込み。

2022-09-23 14:44:40 | Android studio 日記

フラグメントで 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に渡している。


前回と同じにタップすると表示が変わる。
データ参照と更新は行われている。

とりあえず、エラーは出ない。

 

また、画像表示は先延ばし^^;