我有一個3片段的活動,目前我使用ViewPager。我想要實現MVP和活動主持人和演講片段之間的溝通,即:由活動主持人Android MVP - 活動主持人和片段演示者之間的溝通
- 將數據傳遞給片段主持人
- 發送從片段主持人事件,活動主持人
- ...
但我不知道如何以官方的方式做到這一點。我可以使用BusEvent,但我認爲這不是一個好習慣。
我有一個3片段的活動,目前我使用ViewPager。我想要實現MVP和活動主持人和演講片段之間的溝通,即:由活動主持人Android MVP - 活動主持人和片段演示者之間的溝通
但我不知道如何以官方的方式做到這一點。我可以使用BusEvent,但我認爲這不是一個好習慣。
根據我的理解,對於您的UseCase,假設ActivityA擁有一個具有3個片段(FragmentA,FragmentB,FragmentC)的viewPager。
ActivityA有ActivityPresenterA
FragmentA有FragmentPresenterA
按照MVP,FragmentPresenterA應負責FragmentA只有所有的邏輯和業務流程,應僅FragmentA溝通。因此,FragmentPresenterA不能直接與ActivityPresenterA進行通信。
對於從Fragment到Activity的溝通,演示者不應該參與,應該這樣做,因爲我們會在非MVP體系結構中通信,即在界面的幫助下進行溝通。
同樣適用於片段通信活動。
的活動和片段之間的通信讀here
您可以使用一個主持人的這種情況下。
使用您的活動展示器獲取您的片段所需的所有數據。 然後創建一個接口類並將其實現到您的片段。
例如:
爲您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。
你能提供關於你的用例的更多細節嗎?因爲在不同的用例中有一些可能的答案,例如:創建通用業務規則,使用依賴注入,使用事件總線,將束傳遞到碎片等。 –
您能提一下您希望在主持人之間傳遞的數據/事件的示例?你他們是一個普通的數據源嗎? – elmorabea