我需要将一些数据从子 fragment 传递到父 fragment ,当我回到父 fragment 时,我将能够读取这些数据。详细:
我有一个FragmentActivity,它调用FragmentParent。在FragmentParent中,我这样调用FragmentChild:
FragmentChild fragmentChild = new FragmentChild();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frl_view_container, fragmentChild);
transaction.addToBackStack(null);
ctransaction.commit();
在FragmentChild中,我设置了一个字符串值,需要将其传递回FragmentParent,然后再返回至FragmentParent。
String result = "OK";
getFragmentManager().popBackStack();
在FragmentParent中读取结果字符串的最佳/正确方法是什么?
最佳答案
Android体系结构组件解决方案:
如果您使用的是Android体系结构组件,则可以在Fragments
的所有Activity
与ViewModel
之间共享数据。确保ViewModelProviders
使用Activity
上下文创建ViewModels
。
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.
});
}
}
非Android体系结构组件解决方案:
您可以使用setTargetFragment和onActivityResult来实现。
将FragmentParent实例设置为FragmentChild实例上的目标 fragment ,即
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();
在FragmentChild中,无论您在哪里调用popBackStack,都应在设置的目标Fragment上调用onActivityResult。使用 bundle 传递其他数据。
Intent intent = new Intent();
intent.putExtra(FRAGMENT_KEY, "Ok");
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
getFragmentManager().popBackStack();
返回FragmentParent,重写默认的onActivityResult方法。
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);
}
}
}
}