【问题标题】:Fetch Data from another Fragments to Fragment in android从另一个片段获取数据到android中的片段
【发布时间】:2017-12-27 12:35:50
【问题描述】:

我有这个要求,我有一个主片段,其中有一个包含 2 个片段的选项卡,在该屏幕中,“保存按钮”是固定的,位于主片段中。 我想要做的是,当用户单击保存按钮时,我想通过从主片段运行的服务保存 Tab1 和 Tab2 的片段数据。意味着我想将两个选项卡片段的数据提取到主片段。 请帮助我,我搜索了很多但没有找到任何解决方案,我尝试使用方法但它给了我 nullPointerException 和片段未附加错误。

我不使用 Activity 作为主屏幕,因为我的主片段本身是一个选项卡片段屏幕。

【问题讨论】:

    标签: android tabs android-viewpager fragment


    【解决方案1】:

    不可能按照文档直接在片段之间进行通信

    https://developer.android.com/training/basics/fragments/communicating.html

    Fragment 到 Fragment 的通信是通过关联的 活动。两个 Fragment 永远不应该直接通信

    你必须使用接口来实现这个

    【讨论】:

    • 是的,我看到了,但是我的 Main Fragment 本身是一个 Tab Fragment,所以没有办法让它成为 Activity
    【解决方案2】:

    android 中 2 个片段之间没有直接通信,但您可以使用订阅和侦听设计模式来解决这个问题,您可以在自己的接口和侦听器上制作它,您可以像使用 lib 一样

    Eventbus

    EventBus 分 3 步

    定义事件:

    public static class MessageEvent { /* Additional fields if needed */ }
    

    准备订阅者:声明和注释您的订阅方法,可选择指定线程模式:

    @Subscribe(threadMode = ThreadMode.MAIN)  
    public void onMessageEvent(MessageEvent event) {/* Do something */};
    

    注册和注销您的订阅者。例如在 Android 上,Activity 和 Fragment 通常应该根据它们的生命周期进行注册:

     @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());
    

    【讨论】:

      【解决方案3】:

      Fragments 之间的通信是通过父 Activity 完成的。 Fragment 应该获取 Activity 实例并将数据/事件传递给它。

      Activity 应该决定如何处理它 - 可能将它传递给其他片段或多个片段。

      Activity 可以通过FragmentManager API 获取附加的片段。

      在您的TabFragment 中,您应该调用活动(伪代码):

      void onClickedSave() {
          getActvity().onHandleClickedSave();
      }
      

      活动中:

      void onHandleClickedSave() {
          tab1 = findTab1Fragment()
          tab1.handleSave()
          tab2 = findTab2Fragment()
          tab2.handleSave()
      }
      

      当然,您需要自己实施管道。 https://developer.android.com/training/basics/fragments/communicating.html

      顺便说一句,如果您使用 MVVM 设计模式,您的问题将得到解决。 Android 在支持库中支持它。

      【讨论】:

        【解决方案4】:

        片段之间不能直接通信。 片段之间有几种通信方式

        • 使用活动
        • 使用处理程序
        • 使用界面

        【讨论】:

          猜你喜欢
          • 2018-04-07
          • 1970-01-01
          • 2015-01-14
          • 1970-01-01
          • 2022-01-20
          • 2017-03-25
          • 2013-10-20
          • 2015-10-28
          • 1970-01-01
          相关资源
          最近更新 更多