我有一个活动MainActivity
有三个与此活动相关的片段。
现在我的一个片段Timeline
有一个列表视图。我从后端的数据库填充。我使用AsyncTask从数据库中获取值并将它们处理到List。我在片段Timeline
的onCreate中触发此AsyncTask。
现在从Timeline
点击任意列表项后,我导航到另一个Activity
,称为DetailActivity
问题是每当我从DetailActivity
按回{my} MainActivity
的onCreate并且我的列表再次刷新时 - 再次调用整个数据库操作并且我的列表不保持其状态。
我在离开Fragment之前计算了List的可见项目,但是我被迫对这些变量使用静态值,以便保留位置。怎么避免这个?
以下是片段Timeline
中列出的onPause和onResume的片段
static int index;
static int top;
@Override
public void onPause(){
System.out.println("onPause");
index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
top = (v == null) ? 0 : v.getTop();
super.onPause();
uiHelper.onPause();
}
@Override
public void onResume(){
super.onResume();
//dbHelper.open();
System.out.println("onResumr");
lv.setSelectionFromTop(index, top);
ActionBar actionBar = getActivity().getActionBar();
actionBar.setTitle("Timeline");
uiHelper.onResume();
AppEventsLogger.activateApp(getActivity());
updateUI();
}
这也迫使我的AsyncTask一次又一次地运行,这是一个开销。
这个问题的根源 - 经过这么多天的努力,我借了一个朋友的电话进行测试,所有这些都是在这款新手机上排序的。我发现我在开发者设置中打开了Do not keep Activities
选项。愚蠢的我!!
答案 0 :(得分:1)
不幸的是,这是Fragment
类的默认行为。每当包含Fragment
暂停时,Activity
已销毁,并且只要包含Activity
,重新创建 已恢复。如果您使用Activity
而不是Fragment
作为列表,则不会遇到相同的行为。使用Activity
:
AsyncTask
和/或Web服务不会再被调用。如果您希望Fragment
具有相同的行为,则需要覆盖onSaveInstanceState()
方法。虽然有趣,但这不是一件小事。
修改强>
确保在手机的“开发者设置”中取消选中Do not keep Activities
选项。但是,这并没有改变我上面概述的Fragment
类的基本行为。
答案 1 :(得分:1)
您可以在片段上调用setRetainInstance(true)
。但生命周期会略有不同。
此处提供片段生命周期的精彩视图 http://corner.squareup.com/2014/10/advocating-against-android-fragments.html