调用Fragment2获取来自Fragment1

时间:2018-09-21 11:38:29

标签: android android-fragments fragment onactivityresult

我有一个基本活动,其中有2个片段(比如Fragment1和Fragment2) 我需要从Fragment1调用Fragment2来捕获数据,然后在Fragment1中使用相同的数据。

我知道可以在baseActivity的onActivityResult内部获取对结果的Activity调用,但是出于结果目的,我如何从Fragment1调用Fragment2呢?

3 个答案:

答案 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