gpt4 book ai didi

Android:将数据从子 fragment 传递到父 fragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:20 26 4
gpt4 key购买 nike

我需要将一些数据从子 fragment 传递到父 fragment ,当我返回父 fragment 时我将能够读取这些数据。详细说明:

我有一个调用 FragmentParent 的 FragmentActivity。在 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 架构组件,则可以在具有 ViewModelActivity 的所有 Fragments 之间共享数据。确保 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架构组件方案:

您可以使用 setTargetFragmentonActivityResult实现这一目标。

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

关于Android:将数据从子 fragment 传递到父 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com