web-dev-qa-db-ja.com

ナビゲーションアーキテクチャコンポーネントを使用してフラグメントから結果を取得する方法

MainFragmentSelectionFragmentの2つのフラグメントがあるとしましょう。 2つ目は、オブジェクトを選択するためのビルドです。整数。この2番目のフラグメントからの結果を受け取るには、コールバック、バスなどのさまざまなアプローチがあります。

ここで、2番目のフラグメントに移動するためにナビゲーションアーキテクチャコンポーネントを使用することにした場合、次のコードを使用できます。

NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)

ここで、bundleBundleのインスタンスです(もちろん)。ご覧のとおり、コールバックを配置できるSelectionFragmentへのアクセスはありません。問題は、ナビゲーションアーキテクチャコンポーネントで結果を受け取る方法ですか?

20
Nominalista

Googleによると: 共有ViewModelを使用する必要があります 。以下のGoogleの例を確認してください。

共有ViewModel共有データを含み、さまざまなフラグメントからアクセスできます。

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

ViewModelを更新するMasterFragment:

public class MasterFragment extends Fragment {

    private SharedViewModel model;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

共有ViewModelを使用するDetailsFragment:

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, item -> {
           // Update the UI.
        });
    }
}
10
Amir Latifi