Android:将数据从子片段传递到父片段

问题描述 投票:0回答:2

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

我有一个调用 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-fragments
2个回答
46
投票

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架构组件解决方案:

您可以使用 setTargetFragmentonActivityResult 来实现此目的。

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

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

0
投票

ViewModelProviders.of 已弃用。

现在你应该使用

private lateinit var viewModel: MyViewModel
private lateinit var androidViewModel: MyAndroidViewModel
override fun onCreateView(
  inflater: LayoutInflater, container: ViewGroup?,
  savedInstanceState: Bundle?
): View {
  viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
  androidViewModel =          
    ViewModelProvider(this).get(MyAndroidViewModel::class.java)
}

private val viewModel: MyViewModel by lazy {
ViewModelProvider(this).get(MyViewModel::class.java)
}

private val androidViewModel: MyAndroidViewModel by lazy {
ViewModelProvider(this).get(MyAndroidViewModel::class.java)
}
© www.soinside.com 2019 - 2024. All rights reserved.