java - fragment 到 fragment 的通信——为什么接口(interface)真的是必要的?

标签 java android android-fragments

这里是初学者。

据我所知, fragment 应该通过它们的托管 Activity 相互通信,作为在其他情况下保持独立和可重用的一种方式。

我读到应该通过在 fragment 中声明接口(interface)并在 Activity 中实现它们来完成。 这是否是“仅仅”解决此问题的最佳方式,因为您可以确保 Activity 已准备好进行该通信(它确实具有处理通信的方法)?

因为我很难全神贯注于接口(interface)(以及 java/android 中的许多其他东西,就此而言),这可以在没有接口(interface)的情况下完成吗?我能否在 fragment 中获取对托管 Activity 的引用并仅调用该 Activity 的方法?

( fragment 类)

Activity activity = getActivity();

activity.doThatThingToOtherFrag(String myString);

( Activity 课)

Fragment otherFragment = getSupportFragmentManager().findFragmentById(R.id.myOtherFrag);

public void doThatThingToOtherFrag(String string) {
//do something to myOtherFrag
}

或者在这种情况下是否有其他关于实现接口(interface)的东西我没有得到?

* 编辑 *

假设我在另一个 Activity 中重复使用该 fragment 。只要该 Activity 也有 doThatThingToOtherFrag(String myString) 方法,我就可以通过 getActivity() 获取对它的引用并仍然调用 activity.doThatThingToOtherFrag( String myString) 来 self 的 fragment ,对吧?我不必更改 fragment 代码中的任何内容——或者我是否遗漏了什么?

我想我的问题应该是:那里的接口(interface)是否只是为了确保/任何托管 Activity 实现了 doThatThingToOtherFrag 方法?或者在这种情况下还有什么我不知道的接口(interface)?感谢您的帮助!

最佳答案

“向接口(interface)编程。”是面向对象编程的通用准则。您当然可以直接与 Activity 通信,而无需使用界面。但是,这会在 fragment 和 Activity 之间产生紧密耦合。

考虑这样一种情况,您希望在两个不同的 Activity 中重复使用同一个 fragment 。使用界面可以灵活地做到这一点。

编辑答案:

As long as that activity also has a doThatThingToOtherFrag(String myString) method, I can get a reference to it through getActivity() and still call activity.doThatThingToOtherFrag(String myString) from my fragment, right?

我假设你的意思是这样的:

Activity activity = getActivity();
activity.doThatThingToOtherFrag(String myString);

这不会编译,因为 Activity 没有名为 doThatThingToOtherFrag() 的方法。但是,如果你这样做

FragmentCommunicationInterface activity = (FragmentCommunicationInterface) getActivity();
activity.doThatThingToOtherFrag(String myString);

现在可以编译了。这还有另一个问题:如果将调用此方法的 fragment 添加到 Activity 实现 FragmentCommunicationInterface 会怎样?现在,您将在执行此案例时遇到运行时错误。

一个可能的解决方案是将 FragmentCommunicationInterface 作为 fragment 构造函数的参数:

public class MyFragment extends Fragment {
    private FragmentCommunicationInterface communication;

    public MyFragment(FragmentCommunicationInterface communication) {
        this.communication = communication;
    }
}

现在你创建一个 fragment

MyFragment frag = new MyFragment(this);

使用接口(interface)的另一个优点是接口(interface)可以由任何类 实现,而不仅仅是扩展Activity 的类。这允许比我上面暗示的更多的灵 active 。它允许您组织代码,以您想要的任何方式与 Activity 或其他 fragment 进行通信。

关于java - fragment 到 fragment 的通信——为什么接口(interface)真的是必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39548238/

相关文章:

java - IntelliJ(或其他免费 IDE/工具)是否有可能缩进整个项目(仅缩进而不格式化))

java - Java 9 中的类加载器层次结构

android - Firebase 中的 UTM 跟踪代码

android - AppBarLayout 中的 SwipeRefreshLayout 不包装内容

android - 如何在 Android 导航组件中管理 BottomNavigationView 后台堆栈

Android fragment 翻译从右到左

java - 理解java 8流的过滤方法

Java按钮反转

android - 如何检查 Google map v2 中已存在具有相同地理坐标的标记?安卓

java - android:TimePickerDialog 阻止用户选择过去的时间,并可以选择具有新日期的 future 时间