在活动

时间:2018-04-03 10:10:31

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

我正在创建一个在单个活动中使用多个片段的应用程序,并且大多数片段需要与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) {

}

等等。

在接口实现方面有没有简单的方法来实现某种“范围”?我知道我可以将一个对象传递给实现相应接口的每个片段,但是它比简单地依赖于活动要多得多,这可以通过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
    }
}

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

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

似乎应该有一种更简单的方法来实现这种“分组”,而不需要将单独的实现对象传递给每个片段......任何想法?

1 个答案:

答案 0 :(得分:0)

通常,防止客户端(片段)知道他们不使用的方法是一种很好的做法。这样的接口称为角色接口,因此我坚持使用每个片段的接口方法。

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

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