wake-up-neo.com

Wie erhalte ich mit der Navigationsarchitekturkomponente ein Ergebnis aus einem Fragment?

Nehmen wir an, wir haben zwei Fragmente: MainFragment und SelectionFragment. Die zweite dient zum Auswählen eines Objekts, z. eine ganze Zahl. Es gibt verschiedene Ansätze, um Ergebnisse von diesem zweiten Fragment zu erhalten, wie Rückrufe, Busse usw.

Wenn wir uns nun für die Verwendung von Navigation Architecture Component entscheiden, um zum zweiten Fragment zu navigieren, können wir diesen Code verwenden:

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

dabei ist bundle eine Instanz von Bundle (natürlich). Wie Sie sehen, gibt es keinen Zugriff auf SelectionFragment, wo wir einen Rückruf einleiten könnten. Die Frage ist, wie mit der Navigationsarchitekturkomponente ein Ergebnis erzielt werden kann.

20
Nominalista

Laut Google: Sie sollten versuchen, Shared ViewModel zu verwenden . Überprüfen Sie das folgende Beispiel von Google:

Shared ViewModel , das gemeinsam genutzte Daten enthält und von verschiedenen Fragmenten aus zugänglich ist.

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

MasterFragment, das ViewModel aktualisiert:

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

DetailsFragment, das freigegebenes ViewModel verwendet:

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