[Android/Java] Jetpack Navigation 画面遷移とFragment間のデータ受け渡し


Android Studio 4.1.3(windows版) での流れとなります

以下の記事のプロジェクトベースでの説明となります

Android DeveloperのJetpack Navigationの画面遷移とFragment間のデータ受け渡しの説明は以下です

SafeArgs を追加する

※ 現時点ではandroidx.navigation:navigation-safe-args-gradle-pluginをimplementationでは動作しないようです
※ androidx.navigationのバージョンに合わせて設定してください

build.gradle(Project)
buildscript {
    dependencies {
        def nav_version = "2.3.4"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}
build.gradle(Module)
apply plugin: "androidx.navigation.safeargs"

画面遷移の準備

+ボタンを押してここではNextFragmentを追加します

MainFragmentのActionsの+ボタンを押して画面遷移を追加します

DestinationでnextFragmentを指定してAddボタンで追加します

Actionが追加されました

MainFragmentに画面遷移実行用のボタンとボタンイベントを追加します
ボタンイベントの設定方法を詳しく知りたい場合は以下を参考にしてください
ここではMainFragmentにonClickButtonメソッドを追加しJetpack Databindingでボタンイベントの紐づけをします

画面遷移処理の実装

MainFragment.java
public void onClickButton() {
    final View view = binding.getRoot();
    // MainFragmentDirectionsはsafeargsを有効にすることで自動生成されます
    NavDirections directions = MainFragmentDirections.actionMainFragmentToNextFragment();
    Navigation.findNavController(view).navigate(directions);
}

Fragment間でデータを受け渡す場合

NextFragmentのArgumentsの+ボタンを押します

ここではName:Text Type:String とします

Action(やじるし)のArgument Default Values のdefault value に値を設定します
ここではnoneを設定 ※default valueを設定しないとActionクラスが自動生成されません

NextFragmentに渡したい値(ここでは"xxx")をsetします

MainFragment.java
public void onClickButton() {
    final View view = binding.getRoot();
    // MainFragmentDirections.ActionMainFragmentToNextFragment/setText()は自動生成されます
    MainFragmentDirections.ActionMainFragmentToNextFragment action = MainFragmentDirections.actionMainFragmentToNextFragment();
    action.setText("xxx");
    Navigation.findNavController(view).navigate(action);
}

値を受け取ります
※ ここでは説明を簡略化してますが、実際はJetpack View/DataBindingを使用して値を設定してください

NextFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.next_fragment, container, false);
    // NextFragmentArgsは自動生成されます
    String text = NextFragmentArgs.fromBundle(getArguments()).getText();
    TextView tv = view.findViewById(R.id.textView);
    tv.setText(text);
    return view;
}