2

片段空這裏是我的設置:爲什麼裏面onActivityResult

Activity -> FragmentWithPages -> ViewPager{Fragment1, Fragment2}

從片段1我發動DialogFragment,然後從DialogFragment我啓動activityForResult一個隱含的相機意圖進行拍照。

問題:

有時,從我的攝像頭應用程序崩潰返回片段1的onActivityResult內部時。爲什麼會發生?現在瞭解onActivityResult的回調鏈。它將按照Activity.onActivityResult -> FragmentWithPages.onActivityResult -> Fragment1.onActivityResult -> DialogFragment.onActivityResult的順序返回。所以我的問題是,當我做mDialogFragment.onActivityResult(…)時,爲什麼DialogFragment爲空?

我想它可能與內存有關:系統殺死我的應用程序,然後在相機應用程序返回後重新啓動它。但是,如果是這樣的話,爲什麼DialogFragment鏈中斷鏈?我能做些什麼來防止這個問題或處理它,就像沒有什麼問題一樣?

因此,不,我不是故意單純地抓住NPE,這並沒有太大的作用,因爲它會使我拍攝照片的全部目的失效。

+1

只需使用findFragmentByTag或類似的方法更新對話框片段的引用即可。 – dtx12

+0

這實際上可能會這樣做,但仍然很難測試,因爲它只是有時會發生。加一個幫助。謝謝! –

回答

1

當您從startActivityForResult()返回時,不能保證活動實例是相同的。系統可以自由處理爲結果而開始的活動,並重構它以處理onActivityResult()呼叫。

如果發生這種情況,那當然意味着您之前分配的任何實例字段將不再是如此。您可以使用onSaveInstanceState()並使用傳遞到您的onCreate()的已保存實例狀態Bundle重建您的活動實例。

您可以通過在設備的開發人員設置中設置「不要保留活動」來測試此方案。

1

這是系統破壞您的活動的常見情況,因爲它需要更多資源。您需要實現onSaveInstanceState方法,然後在onCreateonRestoreInstanceState方法中恢復實例狀態。

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putExtra("yourData", yourParcelableData); 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // keep the fragment and all its data across screen rotation 
    setRetainInstance(true); 
    if(savedInstanceState != null){ 
     yourParcelableData = (yourParcelableData)savedInstanceState.getExtra("yourData"); 
    } 

} 

有一個庫,可以讓你更容易做到。 https://github.com/frankiesardo/icepick

+0

感謝您複製我寫的內容。總是很好有2個相同的答案。 –

相關問題