2015-11-06 59 views
0

我有一個MainActivity類(擴展了AppCompatActivity)。在這個類中創建一個NavDrawerFragment(擴展Fragment)mNavigationDrawerFragment。從另一個活動引用活動的屬性

然後有一個WpFragment,它是從選擇mNavigationDrawerFragment的其中一個選項開始的。這個WpFragment啓動一個AsyncTask WpGetTask。在點擊事件中,片段啓動WpDetailActivity。在特殊情況下,WpGetTask啓動WpDetailActivity。

如果我現在選擇WpDetailActivity中的home符號,主活動的mNavigationDrawerFragment()。openDrawer()應該會發生。我通過使用一個靜態類並保存了mNavigationDrawerFragment,這對我有用,但當另一個用戶從WpDetailActivity引用了靜態類的mNavigationDrawerFragment時,它會得到一個NullPointerException。

有什麼不同的方法可以從WpDetailActivity中調用MainActivity的mNavigationDrawerFragment?

回答

1

您不應該假設FragmentActivity中的數據會比可見的持續時間更長 - 它們不能保留。 A Fragment可以訪問Activity附加的變量,但僅在其生命週期中,並且僅在附加到Activity時。

如果您希望通過Activity訪問數據,那麼您應該將數據傳遞給Intent或者使用數據存儲(如SharedPreferences)。

您還有其他選擇,但這裏的問題基本上是,一旦Activity對用戶不可見,Android可能會銷燬它並在需要時重新創建它。這就是當你嘗試訪問Activity中的靜態(或非靜態)類/方法/變量時,有時會得到NPE的原因。

編輯:

閱讀活動的 「流程生命週期」:

http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle

「#3」 中明確指出的Android可以 「安全地殺死它的進程。」這不是要求,這是一種可能性。這意味着,對於一個穩定的應用程序,您應該確保它確實發生並據此進行規劃。

+0

如果選擇了Home符號,我現在嘗試在WpDetailActivity中保存一個靜態布爾值。 MainActivity中的onCreate()讀取此靜態布爾值,並且在重新激活時應該做出反應。但沒有任何反應。所以我想從WpDetailActivity返回主頁後不會重新創建MainActivity。 – user2561735

+0

這是可能的。 Android不能保證它會殺死它,但正如你在你的問題中所述,它可能發生在某些設備上或其他任何設備上。看我的編輯。 – Jim

0

我不知道如何重新生成您的special,也沒有您的代碼。所以這個問題很難確定。

關於您的情況,我的理解是:您需要從WpDetailActivity右側打開抽屜?如果是這樣,我建議你使用eventbus,發送和事件總線通知給MainActivity並調用drawerFragment的openDrawer()方法,希望這會對你有所幫助。

相關問題