我有一个基本活动,其中有2个片段(比如Fragment1和Fragment2) 我需要从Fragment1调用Fragment2来捕获数据,然后在Fragment1中使用相同的数据。
我知道可以在baseActivity的onActivityResult内部获取对结果的Activity调用,但是出于结果目的,我如何从Fragment1调用Fragment2呢?
答案 0 :(得分:1)
没有MVVM
我猜最简单的内置方式是使用Fragment.setTargetFragment(@Nullable Fragment fragment, int requestCode)
来自片段1:
val fragment = Fragment2.newInstane()
fragment.setTargetFragment(this, 10)
当您想将结果返回片段1时,从片段2开始
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
使用documentation推荐的共享视图模型
答案 1 :(得分:0)
我认为您将从此解决方案中获得提示。因为我无法根据您的要求编写代码,但这会给您一个思路,您可以做什么。
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());
答案 2 :(得分:0)
我建议您考虑一下这种紧密的耦合和重构,以使片段不会那么紧密地耦合,并且数据提取也同样会分离。看一下有关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
。