0

我有一個主要的Activity,其中包含ViewPager 4個選項卡。每個標籤內都有一個fragment。我在主Activity上執行ActionBar.TabListener。在OnTabSelected方法中,我調用選定的fragment上的自定義fragment.refresh方法,以便從服務器刷新並更新fragment。方法refresh重置數據。從OnCreateView保留片段的主視圖調用OnDestroyView後

當我關閉應用程序,過了一段時間後,我重新打開它,並從OnCreateView返回的主視圖上獲得NullPointerExceptionfragment

我的問題是:如何在OnDestroyView被調用後保留片段的主視圖?如何在OnCreateView被調用後確保refresh被調用? (我應該使用一個帶有while循環的標誌)?

+1

如果我理解你的問題,你不能保留主視圖或Android中的任何視圖。有時候,視圖可能會被回收,有時甚至不能。你無法控制它。但是,您可以在應用程序退出後保存數據。 –

+0

是的,你確實瞭解它。好的,我在我的刷新功能中獲得了NullPointerexception。因爲我指的是顯然爲空的主視圖。 如何確保我在onCreateView函數後調用刷新函數?你認爲有一面旗子的時候會做嗎? – Pacemaker

回答

1

您可以嘗試將自定義fragment.refresh()放入您的fragment.onResume()中。這樣刷新就會在片段顯示給用戶之前自動調用。

如果你真的要更新的片段,只有當選項卡上的用戶點擊,你可以做這樣的事情:

refresh(){ 
    if(getActivity()!=null && !isDetached()){ // check if fragment is visible 
     refreshData(); // refresh data 
    }else{ 
     needRefresh=true; // set flag for refresh 
    } 
} 

onCreate(...){ 
... 
    if(needRefresh){ 
     needRefresh = false; 
     refreshData(); 
    } 
} 

我想你應該第一個去解決方案,因爲我擔心這第二個解決方案可能不完美。

+0

不錯,我喜歡你的兩個解決方案。關於第一個問題,當用戶從一個標籤的片段移動到另一個活動時會出現問題,然後返回。返回時,它將刷新片段,因爲OnResume在活動再次可見時被調用。但我想我可以使用一個標誌來檢測它是否來自該活動。 – Pacemaker

1

我希望我能正確理解你。首先您的聲明,

如何在OnDestroyView調用 之後保留片段的主視圖?

您不能在內存中緩存視圖對象,尤其是在OnDestroyView()之後。

回答你的第二個問題,你可以在一個覆蓋方法調用你的定製刷新()的片段,如:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    refresh(); 
    ... 
} 
  • 這將確保刷新()OnCreateView()後調用。
  • 也許你想在用戶點擊一個標籤時調用刷新。如果是這樣,您可以使用正確的偵聽器,如onTabSelected()。但看起來你對此不感興趣。
+0

這很有道理。唯一的問題是,就像你說的,我需要在調用onTabSelected事件時調用刷新方法。實際上,如果用戶離開活動,然後又回來一段時間,就會發生這種情況。我認爲onTabSelected在調用setCurrentItem時被調用(沒有用戶實際按下標籤)。所以在我的情況下,刷新方法在構造視圖之前調用,所以我得到NullPointerException。 – Pacemaker

相關問題