2016-04-19 86 views
16

我有一個3片段的活動,目前我使用ViewPager。我想要實現MVP和活動主持人和演講片段之間的溝通,即:由活動主持人Android MVP - 活動主持人和片段演示者之間的溝通

  • 將數據傳遞給片段主持人
  • 發送從片段主持人事件,活動主持人
  • ...

但我不知道如何以官方的方式做到這一點。我可以使用BusEvent,但我認爲這不是一個好習慣。

+0

你能提供關於你的用例的更多細節嗎?因爲在不同的用例中有一些可能的答案,例如:創建通用業務規則,使用依賴注入,使用事件總線,將束傳遞到碎片等。 –

+0

您能提一下您希望在主持人之間傳遞的數據/事件的示例?你他們是一個普通的數據源嗎? – elmorabea

回答

0

根據我的理解,對於您的UseCase,假設ActivityA擁有一個具有3個片段(FragmentA,FragmentB,FragmentC)的viewPager。

ActivityA有ActivityPresenterA

FragmentA有FragmentPresenterA

按照MVP,FragmentPresenterA應負責FragmentA只有所有的邏輯和業務流程,應僅FragmentA溝通。因此,FragmentPresenterA不能直接與ActivityPresenterA進行通信。

對於從Fragment到Activity的溝通,演示者不應該參與,應該這樣做,因爲我們會在非MVP體系結構中通信,即在界面的幫助下進行溝通。

同樣適用於片段通信活動。

的活動和片段之間的通信讀here

+0

這種方法最乾淨嗎?如果這些片段僅與數據有關?在這種情況下不應該這樣做嗎? – kkkkk

+0

如果ViewPager的所有片段都與數據彼此相關或共享公用數據,那麼在這種情況下,片段不需要具有不同的演示者,而ActivityPresenter應該處理這些片段的所有業務邏輯並將數據傳遞給相應的片段接口的幫助。 – nnn

0

您可以使用一個主持人的這種情況下。

使用您的活動展示器獲取您的片段所需的所有數據。 然後創建一個接口類並將其實現到您的片段。

例如:

爲您PageAFragment一個公共接口(該接口將您的數據從活動橋片段)。並使用界面的方法來處理演示者查看的結果。

這是我爲接收數據創建的接口類的示例。對於參數你可以選擇你想要的取決於你的需求,但對我來說我選擇模型。

public interface CallbackReceivedData { 
    void onDataReceived(YourModel model); 
} 

MainActivity類別檢查連接到您的活動片段的實例。在提交片段後放入您的檢查實例。

public class MainActivity extends AppCompatActivity{ 

    private CallbackReceivedData callbackReceivedData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //after commit the fragment 
    if (fragment instanceof PageAFragment){ 
      callbackReceivedData = (CallbackReceivedData)fragment; 
    } 

    } 
    //this is the example method of MainActivity Presenter, 
    //Imagine it, as your view method. 
    public void receivedDataFromPresenter(YourModel model){ 
     callbackReceivedData.onDataReceived(model); 
    } 

} 

我假定receivedDataFromPresenter是我們的視圖的接收方法和獲取數據到主持人。

而現在我們會從發言者數據傳遞到callbackReceivedData

PageAFragment實施CallbackReceivedData並覆蓋onDataReceived方法。現在您可以將活動中的數據傳遞給您的片段。

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public void onDataReceived(YourModel model) { 

    } 
} 

注:另類的方式,你可以使用捆綁,並用setArguments的傳遞數據。

如果你想發送事件從片段到活動你可以按照這個想法。

創建一個接口類並將其實現到您的MainActivity並覆蓋從接口到您的活動的方法,對於我的情況我這樣做。

這是我的CallbackSendData類

public interface CallbackSendData { 
    void sendDataEvent(String event); 
} 

實施CallbackSendData界面,您MainActivity並覆蓋sendDataEvent方法。

public class MainActivity extends AppCompatActivity implements CallbackSendData{ 

    private CallbackReceivedData callbackReceivedData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    //after commit the fragment 
    if (fragment instanceof PageAFragment){ 
     callbackReceivedData = (CallbackReceivedData)fragment; 
    } 

    } 

    //this is the example method of MainActivity Presenter, 
    //Imagine it, as your view method. 
    public void receivedDataFromPresenter(YourModel model){ 
     callbackReceivedData.onDataReceived(model); 
    }  


    @Override 
    public void sendDataEvent(String event){ 
    //You can now send the data to your presenter here. 
    } 



} 

和你PageAFragment你需要使用附加方法來投你的界面。一旦片段與其活動關聯,就會調用attach方法。如果您想了解片段的生命週期,只需單擊此鏈接:https://developer.android.com/reference/android/app/Fragment.html

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

    private CallbackSendData callbackSendData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


    } 

    @Override 
    public void onDataReceived(YourModel model) { 
     //Received the data from Activity to Fragment here. 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
    container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.PagerAFragment, container, 
    false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle 
    savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     Button Eventbutton; 

     Eventbutton = view.findViewById(R.id.event_button); 
     Eventbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       callbackSendData.sendDataEvent("send Data sample"); 
      } 
     }); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try{ 
      callbackSendData = (CallbackSendData) context; 
     }catch (ClassCastException e){ 
      e.printStackTrace(); 
     } 
    } 

}

現在你可以使用CallbackSendData從活動發送的數據片段。

注意:如果您在項目中使用依賴注入,則可以使用Dagger2庫。

Goodluck。

相關問題