2015-07-20 53 views
5

我有一個viewpager裏面的主要片段。這個viewpager有2頁(列表片段)。當我開始活動時,顯示主要片段,並且還顯示第一個分頁片段。此分頁片段使用AsyncTask顯示數據庫中的數據。片段何時最終附加到活動?

在主片段,我有:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    onPageSelected(0); 
} 

@Override 
public void onPageSelected(int position) { 
    Fragment fragment = (Fragment) pagerAdapter.instantiateItem(viewPager, position); 
    if (fragment instanceof IPagedFragment) { 
     ((IPagedFragment) fragment).onShown(getActivity()); 
    } 
} 

和接口是:

public interface IPagedFragment { 
    void onShown(FragmentActivity activity); 
} 

的第一個問題我是,我要通過活動作爲參數,因爲當onShown得到稱爲,該活動仍然爲空。

此外,分頁的片段使用類似於LoginActivity樣本的進度條邏輯。我也得到了以下異常:

IllegalStateException異常:片段PagedFragment1 {} 4201f758在android.support.v4.app.Fragment.getResources(Fragment.java:620)

未連接到活動 那麼,一旦頁面片段完全可用於UI,開始從db中檢索數據的正確階段是什麼?

回答

6

像你這樣的問題是一些開發人員開始質疑片段真的很好還是有用的原因。

也是「正確」是值得商榷的,你可以在不同的地方做,不同的開發商會給你不同的答案,但讓我嘗試爲您提供一些有用的信息。

的附連/分離回調:

public void onAttach(Activity activity); 
public void onDetach(); 

這兩種方法來getActivity()任何調用將返回非空活性的片段被連接到之間。您可以忽略它們,並使用一個private boolean isAttached來跟蹤該呼叫的。

同樣有用的是:

public void onActivityCreated (Bundle savedInstanceState) 

調用此方法AFTERActivity.onCreate方法。如果你依賴於一些初始化所發生有非常重要的。

此外,重要的是要記住,在片段交易發生的那一刻,Fragment.onCreate發生在Activity.onCreate之後,並在輪換之前發生。

根據經驗,一般情況下我使用Fragment.onStart()/Fragment.onStop()來獲得/聽的數據。在這些調用中,所有UI都已創建,片段被附加到活動,並且如果存在對話框/彈出窗口(暫停/恢復),則不會調用這些回調。

0

爲了讓您的活動的參考,創建fragmentActivity的本地對象,讓你活動的參考,如下圖所示。

private FragmentActivity fragmentActivity; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     fragmentActivity=activity; 
    }