从OnCreateView保留片段的主视图调用OnDestroyView后

时间:2015-06-21 16:13:20

标签: java android android-fragments nullpointerexception fragment

我有一个主Activity,其中包含一个带有4个标签的ViewPager。每个标签内都有fragment。我在主ActionBar.TabListener上实施了Activity。在OnTabSelected方法中,我在选定的fragment.refresh上调用自定义fragment方法,以便从服务器刷新并更新fragmentrefresh方法会重置数据。

当我关闭应用程序时,过了一会儿,我重新打开它,我在NullPointerException的{​​{1}}返回的主视图上获得OnCreateView

我的问题是:如何在调用fragment后保留片段的主视图?或者,如何确保OnDestroyViewrefresh调用OnCreateView之后调用? (我应该使用带有while循环的标志吗?)

2 个答案:

答案 0 :(得分: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();
   }
}

我认为你应该采用第一种解决方案,因为我担心第二种解决方案可能并不完美。

答案 1 :(得分:1)

我希望我能正确理解你。首先是你的陈述,

  

如何在OnDestroyView之后保留片段的主视图   叫?

您无法将视图对象缓存在内存中,尤其是在OnDestroyView()之后。

回答你的第二个问题,你可以在Fragment中的覆盖方法中调用你的自定义refresh(),如:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   refresh();
   ...
}
  • 这将确保在OnCreateView()之后调用refresh()。
  • 也许您想在用户点击标签时调用刷新。如果是这样,您可以使用正确的侦听器,如onTabSelected()。但似乎你对此并不感兴趣。