【问题标题】:Organize multiple Fragment interfaces in an Activity在一个Activity中组织多个Fragment接口
【发布时间】:2018-09-12 15:00:23
【问题描述】:

我正在创建一个在单个 Activity 中使用多个 Fragment 的应用,并且大多数 Fragment 都需要与 Activity 交互。我为 Activity 实现的每个片段使用单独的接口。

让您了解它目前的样子

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) {

        }

}

如您所见,需要实现的接口非常多。这没关系,但困扰我的是,各种接口的方法的实现并没有给出任何关于它们属于哪个接口/片段的线索。 onCancel()onSave() 非常通用,所以只看代码无法知道它们是否属于Fragment1InterfaceFragment2Interface 等。

当然,我可以在每个接口方法前面加上接口名称,结果类似于

@Override
public void Fragment1Interface_onCancel(long id) {

}

@Override
public void Fragment2Interface_onSave(long id) {

}

等等。

关于接口实现,有什么简单的方法可以实现某种“范围界定”吗?我知道我可以将一个对象传递给实现各自接口的每个片段,但这比简单地依赖 Activity 要多得多,后者可以通过 getActivity() 从片段中轻松检索。

我考虑的另一个选择是有一个通用接口,例如

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

(显然片段的名称在现实生活中更具描述性!)

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

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

【问题讨论】:

标签: java android android-fragments android-activity interface


【解决方案1】:

一般来说,防止客户(片段)知道他们不使用的方法是一种很好的做法。这样的接口称为角色接口,所以我会坚持使用每个片段的接口方法。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多