片段之间正确的通信方式

时间:2017-03-18 10:30:25

标签: java android android-fragments fragment

这是片段之间正确的通信方式吗?

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相同则不行。无论如何,片段之间的首选通信方式是什么?

3 个答案:

答案 0 :(得分:1)

根据android developer guide,片段之间的通信是通过相关的活动完成的。

片段使用他的界面与Activity通信。并且Activity通过使用findFragmentById()捕获Fragment实例或者根据需要创建一个消息来传递消息,然后直接调用其他片段的公共方法。

  • Fragment1希望传递一些数据:使用Activity实现的接口方法。
  • Activity执行接收数据的方法,创建并替换或查找(取决于您的布局)Fragment2并传递此数据或在fragment2类上执行一些公共方法(取决于您的布局)。
  • Fragment2从bundle中提取数据或执行(取决于你的布局)他的公共方法来接收数据。

我认为您的代码中的问题是您误解了界面目的。您正在使用启动调用该方法的相同片段。 Fragment1在他的onCreateView()中调用了startFragment1(),但它已经启动了。

如果您需要,可以在here中找到一个很好的教程。

答案 1 :(得分:0)

要在组件之间进行通信,请考虑应用程序架构MVP,VIPER等。在代码端,它可以使用事件总线进行通信或只是简单的回调。

  • 在一个地方导航
  • 在另一个地方做业务逻辑
  • 在演示者中进行当前视图逻辑
  • 在视图,片段,适配器中查看逻辑

答案 2 :(得分:0)

在开始时,您可以按Google的建议使用接口在Fragments之间进行通信。

但在片段之间进行通信的一种简单方法是使用事件总线(实现发布/订阅模式),如EventBus库。

您还可以使用RxJava创建自己的事件总线,从而在应用程序的组件之间进行通信(请查看此Stackoverflow问题:RxJava as event bus?