java - 在一个Activity中组织多个Fragment接口(interface)

标签 java android android-fragments android-activity interface

我正在创建一个在单个 Activity 中使用多个 fragment 的应用程序,并且大多数 fragment 需要与 Activity 交互。我为 Activity 实现的每个 fragment 使用单独的接口(interface)。

让你了解它现在的样子

public class MainActivity extends AppCompatActivity implements
    Fragment1.Fragment1Interface,
    Fragment2.Fragment2Interface,
    ListAdapter1.ListAdapter1Interface,   
    Fragment3.Fragment3Interface,
    MyDrawerLayout.MyDrawerCallbacks {

       /* Code omitted for brevity... */

        @Override
        public void onCancel(long id) {

        }

        @Override
        public void onSave(long id) {

        }

}

可以看到,需要实现的接口(interface)还是蛮多的。这没关系,但令我困扰的是,各种接口(interface)的方法的实现并没有提供任何关于它们属于哪个接口(interface)/fragment 的线索。 onCancel()onSave() 是非常通用的,所以只看代码无法知道它们是否属于 Fragment1Interface , Fragment2Interface

当然,我可以在每个接口(interface)方法前加上接口(interface)名称作为前缀,结果类似于

@Override
public void Fragment1Interface_onCancel(long id) {

}

@Override
public void Fragment2Interface_onSave(long id) {

}

等等。

是否有任何简单的方法可以实现某种关于接口(interface)实现的“范围界定”?我知道我可以将一个对象传递给实现相应接口(interface)的每个 fragment ,但这比简单地依赖可以通过 getActivity() 从 fragment 中轻松检索的 Activity 要多得多。

我考虑过的另一个选择是有一个像

这样的通用接口(interface)
public interface FragmentInteractionInterface{
    public FragmentInterface getInterface(Fragment fragment);
}

public interface FragmentInterface{}


public interface Fragment1Interface extends FragmentInterface{
    public void onCancel(long id);
}

public interface Fragment2Interface extends FragmentInterface{
    public void onSave(long id);
}

这里的想法是,Activity 将只实现 FragmentInteractionInterface,并根据 getInterface() 中的 fragment 类型返回 FragmentInterface 的特定实现,如下所示

public FragmentInterface getInterface(Fragment fragment){
    if( fragment instanceof Fragment1 )
        return mFragment1InterfaceImplementation;
    else if( fragment instanceof Fragment2 )
        return mFragment2InterfaceImplementation;
}


Fragment1Interface mFragment1InterfaceImplementation = new Fragment1Interface(){
    @Override
    public void onCancel(long id){
        // Do something
    }
}

Fragment2Interface mFragment2InterfaceImplementation = new Fragment2Interface(){
    @Override
    public void onSave(long id){
        // Do something
    }
}

(显然 fragment 的名字在现实生活中更具描述性!)

我能想到的唯一其他(简单)方法是用注释包围每个已实现的接口(interface)方法,将它们组合在一起(一些接口(interface)包含许多方法)。

似乎应该有更好的方法来以简单的方式实现这种“分组”,而不必诉诸必须将单独的实现对象传递给每个 fragment ……有什么想法吗?

最佳答案

一般来说,防止客户端( fragment )知道它们不使用的方法是一种很好的做法。此类接口(interface)称为角色接口(interface),因此我坚持使用按 fragment 接口(interface)的方法。

回答您的问题,为什么您如此确信实现者应该明确指定接口(interface)/方法关系?您指出方法名称过于通用,但这是命名问题。 fragment 范围内的操作应该保留在那里,因此逻辑上与 Activity 相关的操作将具有适当的命名。

如果您仍然坚持这种完全分离的想法,我建议您使用某种注释处理。

关于java - 在一个Activity中组织多个Fragment接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627454/

相关文章:

java - 使用 SSMTP 和 ProcessBuilder

java - 如何使用 stanford-parser 从文本文件中提取每个句子?

android - 如何在 Android 操作系统上读取 DICOM 文件?

android - 回到默认 fragment

android - fragment 创建后触发 ViewPager 监听器

java - 获取 DefaultListModel 以使用 LinkedList

android - 无法获取提供者 com.crashlytics.android.CrashlyticsInitProvider java.lang.ClassNotFoundException

android - 下载适用于 Android 脚本环境的脚本

android: fragment 中的 tabhost,w/fragments 作为选项卡

java - 如何用正则表达式去除字符串