这是片段之间正确的通信方式吗?
public class MainActivity extends AppCompatActivity implements IFragmentsHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
}
@Override
protected void startFragment1() {
Fragment1 f1 = new Fragment1();
f1.setFragmentsHandler(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, f1)
.commit();
}
@Override
protected void startFramgment2() {
Fragment1 f2 = new Fragment1();
f2.setFragmentsHandler(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, f2)
.commit();
}
}
public class Fragment1 {
private IFragmentsHadnler fragmentsHandler;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment1, container, false);
//...Code...
fragmentsHandler.startFragment1();
}
public void setFragmentsHandler(IFragmentsHandler fragmentsHandler) {
this.fragmentsHandler = fragmentsHandler;
}
}
public class Fragment2 {
private IFragmentsHadnler fragmentsHandler;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment2, container, false);
//...Code...
fragmentsHandler.startFragment2();
}
public void setFragmentsHandler(IFragmentsHandler fragmentsHandler) {
this.fragmentsHandler = fragmentsHandler;
}
}
[EDIT1]:发布了界面(虽然很明显)
public interface IFragmentsHandler {
public void startFragment1();
public void startFragment2();
}
从我的Java角度来看,这将抛出OutOfMemoryError但是如果它与Android相同则不行。无论如何,片段之间的首选通信方式是什么?
答案 0 :(得分:1)
根据android developer guide,片段之间的通信是通过相关的活动完成的。
片段使用他的界面与Activity通信。并且Activity通过使用findFragmentById()捕获Fragment实例或者根据需要创建一个消息来传递消息,然后直接调用其他片段的公共方法。
我认为您的代码中的问题是您误解了界面目的。您正在使用启动调用该方法的相同片段。 Fragment1在他的onCreateView()中调用了startFragment1(),但它已经启动了。
如果您需要,可以在here中找到一个很好的教程。
答案 1 :(得分:0)
要在组件之间进行通信,请考虑应用程序架构MVP,VIPER等。在代码端,它可以使用事件总线进行通信或只是简单的回调。
答案 2 :(得分:0)
在开始时,您可以按Google的建议使用接口在Fragments之间进行通信。
但在片段之间进行通信的一种简单方法是使用事件总线(实现发布/订阅模式),如EventBus库。
您还可以使用RxJava创建自己的事件总线,从而在应用程序的组件之间进行通信(请查看此Stackoverflow问题:RxJava as event bus?)