Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过接口在一个活动和多个片段之间进行通信_Java_Android_Android Fragments - Fatal编程技术网

Java 通过接口在一个活动和多个片段之间进行通信

Java 通过接口在一个活动和多个片段之间进行通信,java,android,android-fragments,Java,Android,Android Fragments,我知道关于这个问题,这里有很多类似的问题和答案,但我所问的略有不同 我有四个Fragments,每个扩展一个BaseFragment。我想为每个片段添加一个侦听器,这样当我的活动触发事件时,所有片段都会收到通知 我试图声明一个接口: public interface OnClearButtonListener { boolean onClearButtonPressed(); } 让我的抽象BaseFragment类来实现它: public abstract class BaseTa

我知道关于这个问题,这里有很多类似的问题和答案,但我所问的略有不同

我有四个
Fragment
s,每个扩展一个
BaseFragment
。我想为每个
片段
添加一个侦听器,这样当我的
活动
触发事件时,所有
片段
都会收到通知

我试图声明一个接口:

public interface OnClearButtonListener {
     boolean onClearButtonPressed();
}
让我的抽象
BaseFragment
类来实现它:

public abstract class BaseTabsFragment extends android.support.v4.app.Fragment implements OnClearButtonListener{
我已经在我的
活动中添加了界面

private OnClearButtonListener clearButtonListener;
但现在我想我需要以某种方式“连接”这两个组件,这样当我从
活动调用
Fragment
s时,
onClearButtonPressed()

但是我不确定我如何才能做到这一点,因为我使用了
TabLayout
ViewPager
,初始化它的代码是:

private void setUpViewPager(ViewPager viewPager) {
    adapter = new MyTabAdapter(getChildFragmentManager());
    adapter.addFragment(TagsFragment.newInstance(), "TAGS");
    adapter.addFragment(PeopleFragment.newInstance(), "PEOPLE");
    adapter.addFragment(CompaniesFragment.newInstance(), "COMPANIES");
    adapter.addFragment(JobsFragment.newInstance(), "JOBS");
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(3);
}

在你的活动中,你有这样一个列表

private List<OnClearButtonListener> clearables;
当您单击按钮时,循环该列表并调用onClearButtonPressed操作


请参阅:

在您的活动中,您持有的列表如下

private List<OnClearButtonListener> clearables;
当您单击按钮时,循环该列表并调用onClearButtonPressed操作


请参阅:

或者您可以使用greenrobot EventBus来实现此目的

首先定义一个事件:

public class OnClearButtonEvent {

    public final String message;

    public OnClearButtonEvent(String message) {
        this.message = message;
    }
}
然后在活动中:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(OnClearButtonEvent event) {/* Do something */};
在onStart和on Pause中,您可以取消/注册eventbus接收器

在baseFragment中:

EventBus.getDefault().post(new OnClearButtonEvent());


如果您使用RxJava,最好使用RxEventBus,或者您也可以使用greenrobot EventBus

首先定义一个事件:

public class OnClearButtonEvent {

    public final String message;

    public OnClearButtonEvent(String message) {
        this.message = message;
    }
}
然后在活动中:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(OnClearButtonEvent event) {/* Do something */};
在onStart和on Pause中,您可以取消/注册eventbus接收器

在baseFragment中:

EventBus.getDefault().post(new OnClearButtonEvent());


如果您使用RxJava,那么最好使用RxEventBus

您是否尝试在您想要接收接口的所有片段中实现该接口callbacks@cricket_007不,按钮属于活动。除非你有别的意思……只要保留对所有片段的引用,并在它们上调用
onClearButtonPressed
,明白了。我正在考虑一些东西,你可能会考虑转换到代码中使用事件,因为它解耦了你的类;通过发布者/订阅者的设计模式,您是否尝试在您想要接收的所有片段中实现该接口callbacks@cricket_007不,按钮属于活动。除非你有别的意思……只要保留对所有片段的引用,并在它们上调用
onClearButtonPressed
,明白了。我正在考虑一些东西,你可能会考虑转换到代码中使用事件,因为它解耦了你的类;通过发布者/订阅者设计模式,您可以进一步解释一下吗
当您添加到适配器时,您需要将相同的实例添加到列表中。
?我添加每个片段,如:
adapter.addFragment(TagsFragment.newInstance(),“TAGS”)如何将该实例添加到列表中?谢谢酷!非常感谢,也请参考!您能解释一下吗
当您添加到适配器时,您需要将相同的实例添加到列表中。
?我添加每个片段,如:
adapter.addFragment(TagsFragment.newInstance(),“TAGS”)如何将该实例添加到列表中?谢谢酷!非常感谢,也请参考!我认为,这是实现回调的最好和最方便的方法。尝试这种方法,而不是传统的回调。有关更多信息,请查看。我认为,这是实现回调的最佳和最方便的方法。尝试这种方法,而不是传统的回调。有关更多信息,请查看。