簡體   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