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”)代码>如何将该实例添加到列表中?谢谢酷!非常感谢,也请参考!我认为,这是实现回调的最好和最方便的方法。尝试这种方法,而不是传统的回调。有关更多信息,请查看。我认为,这是实现回调的最佳和最方便的方法。尝试这种方法,而不是传统的回调。有关更多信息,请查看。