首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Fragment2调用Fragment1的结果

从Fragment2调用Fragment1的结果
EN

Stack Overflow用户
提问于 2018-09-21 11:38:29
回答 3查看 83关注 0票数 0

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

我知道活动对结果的调用可以在onActivityResult of baseActivity中获取,但是为了结果目的,我如何从Fragment1调用Fragment2呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-21 12:21:52

没有MVVM的

我猜最简单的内置方式是使用Fragment.setTargetFragment(@Nullable Fragment fragment, int requestCode)

从第1段:

代码语言:javascript
复制
val fragment = Fragment2.newInstane()
fragment.setTargetFragment(this, 10)

当您想要得到结果时,从片段2返回到片段1:

代码语言:javascript
复制
fun setResultBack(){
    val intent = Intent()
    // inject anything to intent here
    getTargetFragment().onActivityResult(10, Activity.RESULT_OK, intent)
    fragmentManager.popBackStack()
}

最后,从片段1重写onActivityResult

代码语言:javascript
复制
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if(requestCode == 10){
        // handle result here
    } 
    else super.onActivityResult(requestCode, resultCode, data)
}

这在所有情况下都有效,即使在恢复片段状态或配置更改之后也是如此。

与MVVM

按照文档的命令使用共享视图模型

票数 1
EN

Stack Overflow用户

发布于 2018-09-21 11:45:17

我想你会从这个解决方案中得到提示。因为我不能为你的需求编写代码,但这会给你一个想法,你能做什么。

代码语言:javascript
复制
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)制作数据类

代码语言:javascript
复制
public static class MessageEvent { /* Additional fields if needed */ }

(2)订阅事件

代码语言:javascript
复制
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

(3)注册及注销

代码语言:javascript
复制
 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

从任何地方触发

代码语言:javascript
复制
 EventBus.getDefault().post(new MessageEvent());
票数 0
EN

Stack Overflow用户

发布于 2018-09-21 12:38:08

我建议查看这种紧密耦合和重构,这样碎片就不会紧密耦合,数据获取也会类似地解耦。查看有关MVP、MVC或MVVP概念的各种资源。

然而,有时候,你确实需要将一个片段的信息传递给另一个片段。典型的/推荐的方法是定义片段所需的“片段回调”接口,该接口由Activity实现。因此,Activity是进行通信的媒介(这有助于分离片段)。您可以为您的片段使用自定义基类,这样它们就有了接口的通用定义。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52442931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档