【发布时间】:2012-05-23 08:51:43
【问题描述】:
当前,我有 2 个Fragments,可以通过ActionBar 的选项卡进行切换。
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab newTab = getSupportActionBar().newTab();
newTab.setText("history");
newTab.setTabListener(new TabListenerHistoryFragment>(this, "history",
HistoryFragment.class));
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Check if the fragment is already initialized
if (mFragment == null) {
// If not, instantiate and add it to the activity
mFragment = Fragment.instantiate(mActivity, mClass.getName());
mFragment.setRetainInstance(true);
ft.add(android.R.id.content, mFragment, mTag);
} else {
// If it exists, simply attach it in order to show it
ft.attach(mFragment);
}
}
我意识到我的Activity(这个活动有2个片段)第一次启动时,Fragments'的方法将按以下顺序调用。
onCreate -> onCreateView -> onStart
当我执行 Tab 切换,然后 Tab 切换回同一个 Fragment 时,会再次调用以下方法。
onCreateView -> onStart
我只是希望在切换回 Tab 时保持相同的 GUI 视图状态。
- 我希望我的图表继续放大到之前的级别。
- 我希望我的图表水平滚动保持在上一个级别。
- 我希望我的列表继续滚动保持在上一级。
- ...
我知道在Tab切换时可以使用以下方法保存/恢复简单变量
但是,这不是我想要的,因为我的 GUI 状态很难用一大堆原始值来描述。
我尝试以下方法。当然它不起作用,因为我收到以下运行时错误。
public class HistoryFragment extends Fragment {
View view = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (this.view != null) {
return this.view;
}
this.view = inflater.inflate(R.layout.history_activity, container, false);
}
}
java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。
我意识到下面的演示示例能够在 Tab 切换时保留其片段 GUI 状态(例如,列表垂直滚动的位置)。但我想,也许是因为他们使用的是 ListFragment?因为我没有发现他们执行任何特殊处理来保留 GUI 状态。
- com.example.android.apis.app.FragmentTabs
- com.example.android.apis.app.LoaderCursor.CursorLoaderListFragment
请问,如何避免在切换标签页时重新创建相同的视图?
【问题讨论】:
-
你知道怎么做吗?
-
遇到同样的问题。特别是因为我的一个选项卡具有动态添加的字段。
-
这里也一样。你会认为这很简单......
标签: android