2014-04-15 7 views
9

Ich muss einige Daten vom Kindfragment an das Elternfragment übergeben, das ich lesen kann, wenn ich zum Elternfragment zurückgehe. Im Detail:Android: Daten vom Kindfragment zum Elternfragment übergeben

Ich habe eine FragmentActivity, die FragmentParent aufruft. Von FragmentParent nenne ich FragmentChild wie folgt aus:

FragmentChild fragmentChild = new FragmentChild(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.frl_view_container, fragmentChild); 
transaction.addToBackStack(null); 
ctransaction.commit(); 

In FragmentChild ich einen String-Wert gesetzt, die ich brauche, um FragmentParent zurücklaufen und dann zu FragmentParent kehre ich zurück.

String result = "OK"; 
getFragmentManager().popBackStack(); 

Was ist der beste Weg, die Ergebniszeichenfolge in FragmentParent zu lesen?

Antwort

39

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

Dies funktionierte, aber ich bin nicht in der Lage, die Benutzeroberfläche in OnActivityResult zu aktualisieren. Kannst du damit helfen? –

+0

@Manish Mulimani: Großartig, es spart mir Zeit. Danke Manish. – Shailesh

+0

@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

Verwandte Themen