Android Architekturkomponenten Lösung:
Falls Sie Android Architekturkomponenten verwenden, es möglich, Daten zwischen allen Fragments
einem Activity
mit einem ViewModel
zu teilen. Stellen Sie sicher, dass ViewModelProviders
den Activity
Kontext verwendet, um ViewModels
zu erstellen.
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;
}
}
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);
});
}
}
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.
});
}
}
Nicht Android Architekturkomponenten Lösung:
können Sie verwenden setTargetFragment und onActivityResult dies zu erreichen.
Set FragmentParent Instanz als Zielfragment auf FragmentChild Instanz d.h.
FragmentChild fragmentChild = new FragmentChild();
fragmentChild.setTargetFragment(this, FRAGMENT_CODE);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frl_view_container, fragmentChild);
transaction.addToBackStack(null);
transaction.commit();
In FragmentChild, wo Sie die popBackStack sind Aufruf aufrufen onActivityResult auf dem eingestellten Soll-Fragment. Verwenden Sie Bundle, um zusätzliche Daten zu übergeben.
Zurück in FragmentParent überschreiben Sie die Standard onActivityResult-Methode.
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == FRAGMENT_CODE && resultCode == Activity.RESULT_OK) {
if(data != null) {
String value = data.getStringExtra(FRAGMENT_KEY);
if(value != null) {
Log.v(TAG, "Data passed from Child fragment = " + value);
}
}
}
}
Dies funktionierte, aber ich bin nicht in der Lage, die Benutzeroberfläche in OnActivityResult zu aktualisieren. Kannst du damit helfen? –
@Manish Mulimani: Großartig, es spart mir Zeit. Danke Manish. – Shailesh
@Farooq Arshed: Für UI-Update, müssen Sie Ihre Ansicht aktualisieren, wie, ich benutze Adapter, dann benachrichtigen ich nur meinen Adapter in onActivityResult. Das ist es. – Shailesh