当前,我有 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
(这个Activity包含2个Fragment)第一次启动时,Fragment
的方法会按以下顺序被调用。
onCreate -> onCreateView -> onStart
当我执行 Tab 切换,然后 Tab 切换回同一个 Fragment 时,会再次调用以下方法。
onCreateView -> onStart
我只是希望在切换回 Tab 时保持相同的 GUI View 状态。
- 我希望我的图表继续放大到之前的级别。
- 我希望我的图表水平滚动保持在上一个级别。
- 我希望我的列表继续滚动保持在上一级。
- ...
我知道在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:指定的 child 已经有一个 parent 。您必须先在 child 的 parent 上调用 removeView()。
我意识到下面的演示示例能够在 Tab 切换时保留其 fragment GUI 状态(例如,列表垂直滚动的位置)。但我想,也许是因为他们使用的是 ListFragment?因为我没有发现他们执行任何特殊处理来保留 GUI 状态。
- com.example.android.apis.app.FragmentTabs
- com.example.android.apis.app.LoaderCursor.CursorLoaderListFragment
请问,如何避免在切换标签页时重新创建相同的 View ?
最佳答案
我遇到了同样的问题,并尝试按照错误消息中的建议进行操作。 我尝试了以下代码,它对我有用。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
if (mMyView == null) {
mMyView = new MyView(getActivity());
} else {
((ViewGroup) mMyView.getParent()).removeView(mMyView);
}
return mPuzzleView;
}
关于android - 执行选项卡切换时避免重新创建相同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10716571/