片段之间的正确通信方式 [英] Proper way of communication between fragments

查看:84
本文介绍了片段之间的正确通信方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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;
    }
}


:发布了界面(尽管很明显)

public interface IFragmentsHandler {
    public void startFragment1();
    public void startFragment2();
}

从我的Java角度来看,这将引发OutOfMemoryError,但如果Android与Android相同,则不是.无论如何,片段之间的首选通信方式是什么?

解决方案

根据 android开发人员指南,片段之间的通信是通过相关的Activity完成的.

一个片段使用他的界面与Activity通信.然后,Activity通过使用findFragmentById()捕获Fragment实例或在需要时创建一个Fragment实例来传递消息,然后直接调用另一个fragment的public方法.

  • Fragment1想传递一些数据:使用由Activity实现的接口方法.
  • Activity执行该方法来接收数据,创建和替换或查找Fragment2(并根据您的布局)并传递此数据或对fragment2类执行一些公共方法(取决于您的布局).
  • Fragment2从包中提取数据或执行(取决于您的布局)他的公共方法来接收数据.

我认为您代码中的问题是您误解了接口的目的.您正在使用启动该方法的同一片段作为开始. Fragment1正在其onCreateView()中调用startFragment1(),但它已经启动.

如果需要,请在此处中有一个很好的教程. /p>

Is this a proper way of communication between fragments ?

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] : Posted the Interface (though it was obvious)

public interface IFragmentsHandler {
    public void startFragment1();
    public void startFragment2();
}

From my Java perspective this will throw OutOfMemoryError but I'm not if it is the same for the Android. Anyway what is the preferred way of communication between fragments?

解决方案

According to android developer guide, communication between fragments is done through the associated Activity.

A fragment use his interface to communicate with the Activity. And the Activity deliver a message by capturing the Fragment instance with findFragmentById() or creating one if needed, then directly call the other fragment's public methods.

  • Fragment1 wants to pass some data: uses his interface method implemented by Activity.
  • Activity executes that method receiving the data, create&replace or find (depending on your layout) the Fragment2 and pass this data or execute some public method on fragment2 class (depending on your layout).
  • Fragment2 extract data from bundle or execute (depending on your layout) his public method to receive the data.

I think the problem in your code is you are misunderstanding interface purpose. You are using for start the same fragment who is calling the method. Fragment1 is calling startFragment1() in his onCreateView(), but it is already started.

If you needed, in here there is a good tutorial.

这篇关于片段之间的正确通信方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆