我有一个基本活动,其中我有两个片段(比如Fragment1 & Fragment2),我需要从Fragment1调用Fragment2来捕获数据,然后在Fragment1中使用相同的片段。
我知道活动对结果的调用可以在onActivityResult of baseActivity中获取,但是为了结果目的,我如何从Fragment1调用Fragment2呢?
发布于 2018-09-21 12:21:52
没有MVVM的
我猜最简单的内置方式是使用Fragment.setTargetFragment(@Nullable Fragment fragment, int requestCode)
从第1段:
val fragment = Fragment2.newInstane()
fragment.setTargetFragment(this, 10)当您想要得到结果时,从片段2返回到片段1:
fun setResultBack(){
val intent = Intent()
// inject anything to intent here
getTargetFragment().onActivityResult(10, Activity.RESULT_OK, intent)
fragmentManager.popBackStack()
}最后,从片段1重写onActivityResult:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if(requestCode == 10){
// handle result here
}
else super.onActivityResult(requestCode, resultCode, data)
}这在所有情况下都有效,即使在恢复片段状态或配置更改之后也是如此。
与MVVM
按照文档的命令使用共享视图模型
发布于 2018-09-21 11:45:17
我想你会从这个解决方案中得到提示。因为我不能为你的需求编写代码,但这会给你一个想法,你能做什么。
public class Fragment1 extends android.support.v4.app.Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof ActivityHome) {
((ActivityHome) context).setFragment1(this);
}
}
}
public class ActivityHome extends AppCompatActivity {
Fragment1 fragment1;
public void setFragment1(Fragment1 fragment1) {
this.fragment1 = fragment1;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (fragment1 != null) fragment1.onActivityResult(requestCode, resultCode, data);
}
}甚至您也可以使用接口来实现这一点,但我建议您使用EventBus,因为这是一个很小的库,这使得通信非常容易。
(1)制作数据类
public static class MessageEvent { /* Additional fields if needed */ }(2)订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};(3)注册及注销
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}从任何地方触发
EventBus.getDefault().post(new MessageEvent());发布于 2018-09-21 12:38:08
我建议查看这种紧密耦合和重构,这样碎片就不会紧密耦合,数据获取也会类似地解耦。查看有关MVP、MVC或MVVP概念的各种资源。
然而,有时候,你确实需要将一个片段的信息传递给另一个片段。典型的/推荐的方法是定义片段所需的“片段回调”接口,该接口由Activity实现。因此,Activity是进行通信的媒介(这有助于分离片段)。您可以为您的片段使用自定义基类,这样它们就有了接口的通用定义。
public class MyBaseFragment extends Fragment {
public interface FragmentCallbacks {
// Use whatever arguments you may require here
void fetchData();
}
protected FragmentCallbacks mCallbacks;
@Override
void onAttach(Context context) {
try {
mCallbacks = (FragmentCallbacks)context;
} catch (ClassCastException e) {
throw new RuntimeException("Activity must implement FragmentCallbacks");
}
}
}现在,在Fragment1中,您可以调用mCallbacks.fetchData(),Activity可以用来调用在Fragment2中创建的公共方法。当它返回数据(可能是异步)时,它可以通过您创建的公共方法将其提供给Fragment1。
https://stackoverflow.com/questions/52442931
复制相似问题