java - fragment 之间通信的正确方式

标签 java android android-fragments fragment

这是 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 也是如此,我不会。无论如何, fragment 之间的首选通信方式是什么?

最佳答案

根据android developer guide ,fragment之间的通信是通过关联的Activity来完成的。

fragment 使用他的接口(interface)与 Activity 进行通信。 Activity 通过使用 findFragmentById() 捕获 Fragment 实例或根据需要创建一个 Fragment 实例来传递消息,然后直接调用另一个 Fragment 的公共(public)方法。

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

我认为您代码中的问题是您误解了接口(interface)的目的。您正在使用调用该方法的同一个 fragment 来启动。 Fragment1 在 onCreateView() 中调用 startFragment1(),但它已经启动了。

如果您需要,请在 here有一个很好的教程。

关于java - fragment 之间通信的正确方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42873185/

相关文章:

java - 从 ArrayList 中的对象编辑变量?

java - 从 OpenID 2.0 迁移到 OpenID Connect : cannot use the openid_id to select appengine users

Android TableLayout - 同一列内的 TextView 和按钮

android - 如何使用 viewpager 从选项卡布局中的 recyclerview 重新加载 fragment ?

java - 将 KeyEvent 传递给不同的组件

java - 为什么选择 31 在 hashcode() 实现中进行乘法运算?

android - 在更改 View 的可见性时应用动画

android - 在 Android 手机上使用相机拍摄的图像面临方向问题

android - fragment 在 Activity 结果调用后关闭

android - fragment 中的菜单未显示