SlidingTabLayout选项卡之间的通信

8

我一直在寻找如何使用SlidingTabLayout在Fragment之间进行通信的方法,但是一直没有得到一个好的答案。我知道可以使用ActionBar,但我想要使用适用于Android Lollipop的新方法,即使用SlidingTabLayout。我尝试了这个-> http://android-er.blogspot.in/2012/06/communication-between-fragments-in.html 但我想要Material Design。我参考了这个链接http://www.android4devs.com/2015/01/how-to-make-material-design-sliding-tabs.html 来制作Material Design滑动选项卡。现在我想知道如何在滑动选项卡之间进行通信。我尝试了很多次,但没有找到我想要的答案。非常感谢任何帮助。


基本上它是一个片段之间的通信,对吧?那么尝试搜索关于片段通信的内容。http://developer.android.com/training/basics/fragments/communicating.html - Anoop M Maddasseri
是的,就是这样。链接并没有真正解释如何使用滑动选项卡。我已经尝试过了,但没有成功 :( - MVK059
http://developer.android.com/training/implementing-navigation/lateral.html - Anoop M Maddasseri
你的每个选项卡都是一个新的片段吗? - milez
是的,没错。有两个选项卡。 - MVK059
3个回答

6
最简洁的方法是定义一个接口,包含FragmentActivity将实现该接口。这是我最近解决此问题的方法:
首先,在其自己的文件中定义接口,因为它必须对其他类可见。
public interface FragmentCommunication
{
    public void printMessage(String message);
    //....    
}

在您的Activity中,您需要实现此接口。
public class MainActivity extends ActionBarActivity implements FragmentCommunication
{   
    //....
    public void printMessage(String message)
    {
        System.out.println(message);
    }
}

最后,在您的Fragment中,您可以使用getActivity()方法获取托管的Activity,并且要使用通信方法,只需将活动转换为实现的通信接口即可,如下所示:

((FragmentCommunication) getActivity()).printMessage("Hello from Fragment!");

编辑:为了将消息进一步传递给其他Fragment,请执行以下操作:由于您的选项卡都扩展了Fragment,因此最好创建另一个接口。

public Interface ReceiverInterface
{
    public void receiveMessage(String str);
}

然后在您的选项卡中实现这一点。
public class Tab1 extends Fragment implements ReceiverInterface
{
   // .... code .....
    public void receiveString(String str)
    {
        //use str
    }
}

为了将此消息进一步发送到其他片段,需要活动看到它们。例如,现在修改Activity实现的printMessage()为以下内容:
    public void printMessage(String message)
    {
        System.out.println(message);
        //Send the message that came from one fragment to another
        if (tabFragment1 instanceof ReceiverInterface){
            ((ReceiverInterface) tabFragment1).receiveMessage(message);
        }
    } 

我想从一个片段发送一个字符串到另一个片段。因此,当我在片段A中点击一个按钮时,它应该传递一个bundle或一个字符串到片段B。你认为我该怎么做? - MVK059
那么需要确保活动可以访问两个片段。是这样吗?您通过接口从一个片段发送字符串,并在接口方法中将其放置到活动的片段中。片段也需要一个接收消息的方法,但只要它们是公共的,活动就可以看到片段拥有的所有方法,因此不需要接口。 - milez
是的,该活动可以访问两个片段。我从片段A发送字符串,但我遇到的问题是片段B没有接收到发送的内容。如何在片段B中实现接收消息的方法? - MVK059
你可以的时候至少试一下吗?这将是一个巨大的帮助。我已经被这个问题卡了一个星期了,真的需要帮助。 - MVK059
我希望我的编辑解决了这个问题。我理解你的Activity可以访问片段的实例。 - milez
显示剩余6条评论

4
当你滑动选项卡 (ViewPager) 时,你可以使用相同的 Fragment 或不同的 Fragments
如你之前提到的,你尝试过 this,所以我会选择不同的 Fragments
你要做的就是基本上使用 EventBus: https://github.com/greenrobot/EventBus
将其添加到位于 app 文件夹内的 build.gradle 依赖项中。
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'de.greenrobot:eventbus:2.4.0'   
}

你也可以使用 Intents 来实现。

1 - 创建一个类来表示文本更改时的事件:

public class TextChangedEvent {
  public String newText;
  public TextChangedEvent(String newText) {
      this.newText = newText;
  }
}

2 - 片段 A:

//when text changes
EventBus bus = EventBus.getDefault();
bus.post(new TextChangedEvent(newText));    

3 - 片段 B:

EventBus bus = EventBus.getDefault();

//Register to EventBus
@Override
public void onCreate(SavedInstanceState savedState) {
 bus.register(this);
}

//catch Event from fragment A
public void onEvent(TextChangedEvent event) {
 yourTextView.setText(event.newText);
}

来源: https://dev59.com/gWIj5IYBdhLWcg3wPy4a#20475430


当我将 compile 'de.greenrobot:eventbus:2.4.0' 添加到我的 gradle 文件中时,它显示无法解析。 - MVK059
你是在正确的位置添加吗?它应该在你的 app build.gradle 文件中。如果我的编辑没有帮助,请参考这个链接:https://dev59.com/h14b5IYBdhLWcg3w9Fur - Machado
非常感谢。它非常迅速地完成了工作。非常感谢。 - MVK059
你真是救星!使用LiveData能否做到同样的事情? - Karan Khurana

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接