![](/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.