【发布时间】: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() 非常通用,所以只看代码无法知道它们是否属于Fragment1Interface、Fragment2Interface 等。
当然,我可以在每个接口方法前面加上接口名称,结果类似于
@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 包围每个已实现的接口方法,将它们组合在一起(某些接口包含许多方法)。
似乎应该有更好的方法以一种简单的方式实现这种“分组”,而不必将单独的实现对象传递给每个片段......有什么想法吗?
【问题讨论】:
-
这将帮助您developer.android.com/topic/libraries/architecture/… 在两个片段和活动之间进行通信。
-
所有fragment只需要一个接口,就可以确定哪个fragment调用了接口方法。
标签: java android android-fragments android-activity interface