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

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に渡している。


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

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

 

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

 


Fragment+ViewModel [基礎] ViewModelの共有化。

2022-09-23 13:06:07 | Android studio 日記

各フラグメントから共有データを取り出せるかテストする。


結果はデータをViewModelに集約できる事が分かった。
Observerを使う目安がまだよく分からないが意識しておく。

 


【MainActivity.java】は前回のまま。


【MyMainData.java】を新設。LiveDataの使用基準はよく分からない。

public class MyMainData {

    // LiveData になる宣言。
    private MutableLiveData< String> textData1 = null;
    public MutableLiveData< String> getTextData1() {
        if (textData1 == null) {
            textData1 = new MutableLiveData< String>("text data 1");
        }
        return textData1;
    }

    // LiveData にならない宣言。
    private String textData2 = "text data 2";

    public String getTextData2() {
        return textData2;
    }
    public void setTextData2(String textData2) {
        this.textData2 = textData2;
    }
}


【MainViewModel.java】 MyMainDataクラスをインスタンス化。

public class MainViewModel extends ViewModel {

//  LiveData になる
    private MutableLiveData< String> targetPath = null;
    public MutableLiveData< String> getPathName() {
        if (targetPath == null) {
            targetPath = new MutableLiveData< String>();
        }
        return targetPath;
    }


//  LiveData にならない
    private final MyMainData mainData = new MyMainData();
    public MyMainData getMainData() {
        return mainData;
    }
}

 

【MainFragment.java】 一部を抜粋。

    @SuppressLint({"FragmentLiveDataObserve", "UseRequireInsteadOfGet"})
    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        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);
        }


        // 追加。MyMainDataのtextData1の値をsetValue("live data 1")で更新。
        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) {
        // タップされたらMyMainDataのtextData2の値を取り出しMainViewModelのtargetPathを更新させてる
        mViewModel.getPathName().setValue(mViewModel.getMainData().getTextData2());
        return false;
    }


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

画像表示は次?