![](/img/trans.png)
[英]Implementing Fragment to Activity communication without implementing interfaces directly in Activity
[英]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()
非常通用,因此仅查看代码就无法知道它们是否属于Fragment1Interface
, Fragment2Interface
等。
当然,我可以在每个接口方法的前面加上接口名称,结果是
@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.