首先,我的解決方案包括:FragmentManager.FragmentLifecycleCallbacks
,這是一個
回調接口,用於收聽片段內發生的狀態變化給定FragmentManager
和棍棒與關注分離,以Android Architecture Blueprints中顯示的方式,我會說。
Activity
創建Presenter
,沿View
/Fragment
傳球,讓
Presenter
知道它View
,進而將自身的Presenter
在Activity
的onCreate
我註冊一個FragmentLifecycleCallbacks
監聽器通過調用這個
private void registerFragmentsLifecycleListener() {
// All registered callbacks will be automatically unregistered when
// this FragmentManager is destroyed.
getSupportFragmentManager.registerFragmentLifecycleCallbacks(
new FragmentManager.FragmentLifecycleCallbacks() {
// Called after the fragment has returned from its onActivityCreated
@Override
public void onFragmentActivityCreated(FragmentManager fm, Fragment f,
Bundle savedInstanceState) {
createPresenter(f);
}
}, false); // true to register callback for all child FragmentManagers
}
監聽器獲取Fragment
後通知已經從onActivityCreated
回到了確保,只有由ViewPager
新Presenter
每添加一個新的Fragment
實例將被創建。片段可以被連接/分離,它的視圖可以被創建/銷燬幾次,不需要做任何事情,仍然得到它的Presenter
。
因爲在娛樂的情況下(例如通過旋轉)Fragment
S'onCreate
是Activity
■一個叫之前(其中FragmentLifecycleCallbacks
註冊偵聽!),聽者無法實現onFragmentCreated
,它必須是onFragmentActivityCreated
。
對於給定的新Fragment
實例,然後我們就可以判斷這是需要Presenter
:
private void createPresenter(Fragment fragment) {
if (fragment instanceof WhateverContract.View) {
WhateverContract.Presenter whateverPresenter =
new WhateverPresenter((WhateverContract.View) fragment);
} else if (...){}
}
的Presenter
連接在構造
private final WhateverContract.View mView;
public WhateverPresenter(@NonNull WhateverContract.View view) {
mView = checkNotNull(view, "view cannot be null!");
mView.setPresenter(this);
}
其View
/Fragment
,然後可以在開始Fragment
s onResume
。
如果有什麼問題或改進,請讓我知道:)
我想在android系統視圖創建因爲活動/片段的生命週期只是演示。所以你應該從viewpager中移除初始化到片段本身 –
所以管理演示者的生命週期以及片段生命週期 –
有道理......但是我想看看是否還有其他方法來解耦演示者初始化從片段 – vkislicins