android - 执行选项卡切换时避免重新创建相同的 View

标签 android

当前,我有 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切换时可以使用以下方法保存/恢复简单变量

android fragment- How to save states of views in a fragment when another fragment is pushed on top of it

但是,这不是我想要的,因为我的 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/

相关文章:

Android:逆向工程如何工作?

java - Android:NoClassDefFoundError:java.nio.charset.StandardCharsets 在 SDK 18 上发送电子邮件

android - JQuery 手机 : does data-transition ="slideback" or alike exist?

java - libGDX And​​roid 项目上的 Box2dLights

java - 错误: Attempt to invoke virtual method 'void android.widget.Filter.filter(java.lang.CharSequence)' on a null object reference

android - 多进程应用程序中的 Firebase 分析事件日志记录

android - Aosp 构建错误

android - 如何获得两次用户输入文本之间的时间?

android - 未存储 xml 首选项文件中的 defaultValue - 为什么?

android - Google+ 登录 onConnected 未调用