Android:将数据从子片段传递到父片段 [英] Android: Passing data from child fragment to parent fragment

查看:27
本文介绍了Android:将数据从子片段传递到父片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to pass some data from the child fragment to the parent fragment that I will be able to read when I go back to the parent fragment. In detail:

我有一个调用 FragmentParent 的 FragmentActivity.从 FragmentParent 我这样称呼 FragmentChild :

I have a FragmentActivity that calls FragmentParent. From FragmentParent I call FragmentChild like this:

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

在 FragmentChild 中,我设置了一个字符串值,我需要将其传回 FragmentParent,然后返回给 FragmentParent.

In FragmentChild I set a string value which I need to pass back to FragmentParent and then I return back to FragmentParent.

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

在 FragmentParent 中读取结果字符串的最佳/正确方法是什么?

What is the best/proper way to read the result string in FragmentParent?

推荐答案

Android架构组件解决方案:

如果您使用的是 Android 架构组件,则可以使用 ViewModelActivity 的所有 Fragments 之间共享数据.确保 ViewModelProviders 使用 Activity 上下文来创建 ViewModels.

In case you are using Android architecture components, it possible to share data between all Fragments of an Activity with a ViewModel. Ensure ViewModelProviders makes use of Activity context to create 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 来实现这一点.

You can use setTargetFragment and onActivityResult to achieve this.

将 FragmentParent 实例设置为 FragmentChild 实例上的目标片段,即

Set FragmentParent instance as target fragment on FragmentChild instance i.e.

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 传递额外数据.

In FragmentChild, wherever you are invoking the popBackStack, call onActivityResult on the set target Fragment. Use Bundle to pass on additional data.

Intent intent = new Intent();
intent.putExtra(FRAGMENT_KEY, "Ok");
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
getFragmentManager().popBackStack();

回到 FragmentParent,覆盖默认的 onActivityResult 方法.

Back in FragmentParent, override the default onActivityResult method.

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:将数据从子片段传递到父片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆