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

android OS & iPadOS の記録。

Fragment+ViewModel を使ったImageViewerの基幹。

2022-09-20 16:11:03 | Android studio 日記
テンプレートに書き足してテストする。

アクティビティとフラグメントのデータ渡し部分を確認する。


【MainActivity.java】
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
MainFragment mFragment = MainFragment.newInstance("filepath");
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, mFragment)
.commitNow();

View view = (View)findViewById(R.id.container);
view.setOnTouchListener((MainFragment)mFragment);//フラグメントへタッチイベント通知。
}
}
}

 

//implements View.OnTouchListener で通知を受け取る準備。

【MainFragment.java】
public class MainFragment extends Fragment implements View.OnTouchListener {

    private MainViewModel mViewModel;

    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")
    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Bundle args = getArguments();// Bundle にパラメータを取得
        if(args != null ){
            String path = args.getString("test");
            TextView text = view.findViewById(R.id.message);
            text.setText(path);
        }


        mViewModel = new ViewModelProvider(this).get(MainViewModel.class);//ViewModel設定

        final Observer< String> nameObserver = new Observer< String>() {//LiveData設定
            @Override
            public void onChanged(@Nullable final String newName) {
                TextView text = view.findViewById(R.id.message);
                text.setText(newName);
            }
        };
        mViewModel.getPathName().observe(this, nameObserver);

    }


    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mViewModel.getPathName().setValue("ファイルパス");//テスト。タップで受け渡しができていれば文字が変わる。
        return false;
    }

}


【MainViewModel.java】
public class MainViewModel extends ViewModel {

    private MutableLiveData< String> targetPath;//LiveData

    public MutableLiveData< String> getPathName() {
        if (targetPath == null) {
            targetPath = new MutableLiveData< String >();
        }
        return targetPath;
    }

}


とりあえず、データの受け渡しは意外と楽そう。
タッチイベントも送信側と受信側の準備をする。という事で問題ない。

過去の日記を見ると七転八倒しているな^^;
何事も積み重ねである(笑)


次は複数のフラグメントを移動して、Assetsフォルダに用意した画像をそれぞれ表示する。

 






テンプレート(Fragment+ViewModel)

2022-09-20 15:35:22 | Android studio 日記
2021.2.1で用意されているテンプレートを使ってみる。

------
ViewModel は、ライフサイクルを意識した方法で UI 関連のデータを保存し管理するためのクラスです。
ViewModel クラスを使用すると、画面の回転などの構成の変更後にデータを引き継ぐことができます。
------ developerから引用。


UI 関連のデータは、recyclerView のリストデータやビットマップも入る?
別のFragmentでも共有できるらしいのでViewModelは覚えた方が良い。

また、ViewModelの中でLiveDataを使うことでライフサイクルの変化でも上手いことやって最新のデータを管理してくれるらしい。
Fragment間で。
メモリリークも起こらないというので合わせて覚える。説明は難解だけど使って試すしかない。