【问题标题】:Passing values between Fragments in FragmentPagerAdapter在 FragmentPagerAdapter 中的 Fragment 之间传递值
【发布时间】:2015-03-10 10:32:29
【问题描述】:

FragmentPageradapter 我有 3 个片段。在前两个片段中有一个SeekBar。当SeekBar 中的任何一个更改其在fragment1 中的值时,我想更改SeekBar 的值,它位于fragment2 中。我怎样才能实现它?

【问题讨论】:

    标签: android fragment fragmentpageradapter


    【解决方案1】:

    解决方法如下:

    1. 首先创建一个接口

      public interface SeekChangeInterface {
          public void sendChangedValue(int value)
      }
      
    2. FragmentPagerAdapter 所属的 Activity 中实现它

    3. 在第一个片段中创建接口对象

      SeekChangeInterface  mSeekChangeInterface;
      
    4. 在第一个片段中声明onAttach()

      @Override
      public void onAttach(Activity activity) {
          super.onAttach(activity);
      
          mSeekChangeInterface = (SeekChangeInterface )activity;
      }
      
    5. 在搜索栏更改监听器调用

      mSeekChangeInterface.sendChangedValue(valueofseekbar)
      
    6. 在第二个片段中创建一个方法

      public void setSeekBarValue(int progress){
          seekBar.setProgress(progress);
      }
      
    7. 从ActivitysendChangedValue()调用这个方法

       public void sendChangedValue(int progress){
           objectoffragnentpageradapter.getItem(1).setSeekBarValue(progress);
       }
      

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      不要持有对片段的引用并尝试以这种方式更新它。片段可能为空,或尚未附加。

      尝试使用活动。在您的活动中实现一个设置器,并在搜索栏更改侦听器中使用它来设置当前值。 在另一个片段中使用活动来恢复值。

      类似:

      ((MyActivity) getActivity()).setSeekValue(40);
      ((MyActivity) getActivity()).getSeekValue();
      

      请注意,这不是一个完美的解决方案,因为活动也可以为空(添加空检查)并且您必须强制转换为 MyActivity。但我认为这是一个可用的快速解决方案。

      希望对你有帮助

      【讨论】:

      • 但是我如何在片段寻呼适配器的另一个片段中通知这个值? tabviewpager 更改时不会调用 onresume
      • 查看 Mahmoud Elmorabea 的回答中的评论
      【解决方案3】:

      一种方法是让您的活动负责通信,这意味着当搜索栏发生变化时,片段应该执行以下操作:

      ((YourActivity) getActivity()).notifySeekBarValueChanged(int);
      

      在你的活动中

      private void notifySeekBarValueChanged(int value) {
          MyFragment frag = getSupportFragmentManager().findFragmentById(int);
          frag.seekBarValueChangedTo(value);
      }
      

      另一种方法是在片段之间使用某种消息传递机制,例如 EventBusOtto

      【讨论】:

      • 也许将两者结合起来会有用。如果片段由适配器创建,则可以通过活动在 onResume 中恢复该值。如果片段已经存在,则事件总线传播新值。
      • 第一次注册时,如果 EventBus 存在,有一种方法可以设置默认值,但是很好的建议 :)
      • 我不知道 EventBus 的这个功能 :)
      猜你喜欢
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多