繁体   English   中英

在一个活动中组织多个Fragment接口

[英]Organize multiple Fragment interfaces in an 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) {

        }

}

如您所见,有很多接口需要实现。 没关系,但是让我感到困扰的是,各种接口方法的实现并没有提供关于它们属于哪个接口/片段的任何线索。 onSave() onCancel()onSave()非常通用,因此仅查看代码就无法知道它们是否属于Fragment1InterfaceFragment2Interface等。

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

@Override
public void Fragment1Interface_onCancel(long id) {

}

@Override
public void Fragment2Interface_onSave(long id) {

}

等等。

是否有任何简单的方法可以实现有关接口实现的某种“作用域”? 我知道我可以将一个对象传递给实现各自接口的每个片段,但是这比仅依赖Activity可以完成很多工作,而Activity可以通过Fragment中的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()的片段类型返回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
    }
}

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

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

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

通常,防止客户(片段)了解他们不使用的方法是一个好习惯。 这种接口称为角色接口,因此我会坚持使用每个片段的接口方法。

回答您的问题,为什么您如此确信实现者应明确指定接口/方法关系? 您指出方法名称太通用,但这是命名问题。 范围限定为片段的动作应保留在此处,并且与活动在逻辑上相关的动作应具有适当的命名。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM