Android 碎片选项卡每次创建新的碎片对象

Android 碎片选项卡每次创建新的碎片对象,android,android-tabhost,fragment,Android,Android Tabhost,Fragment,我想使用以下代码: ,但我看到它在每个交换机之间创建和删除片段。您能告诉我如何更改它吗?这样每个片段在开始时或第一次进入后只创建一次?谢谢 另外,我正在使用带有TabHost的Fragment,用于显示放置在其中的其他片段之一 更新: 每次从一个选项卡切换到另一个选项卡后,我都会在子片段中获得onCreateView和onActivityCreated方法。这不是因为这句台词吗 if (mLastTab != null) { if (mLastTab.fragment != null) {

我想使用以下代码: ,但我看到它在每个交换机之间创建和删除片段。您能告诉我如何更改它吗?这样每个片段在开始时或第一次进入后只创建一次?谢谢

另外,我正在使用带有TabHost的Fragment,用于显示放置在其中的其他片段之一

更新: 每次从一个选项卡切换到另一个选项卡后,我都会在子片段中获得onCreateView和onActivityCreated方法。这不是因为这句台词吗

if (mLastTab != null)
{
 if (mLastTab.fragment != null)
 {
  ft.detach(mLastTab.fragment);
 }
}
TabManager的完整源代码放在片段子类中:

public class TabManager implements TabHost.OnTabChangeListener
  {
    private final TabHost mTabHost;
    private final int mContainerId;
    private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>();
    TabInfo mLastTab;

    final class TabInfo
    {
      private final String tag;
      private final Class<?> clss;
      private final Bundle args;
      private Fragment fragment;

      TabInfo(String _tag, Class<?> _class, Bundle _args)
      {
        tag = _tag;
        clss = _class;
        args = _args;
      }
    }

    class DummyTabFactory implements TabHost.TabContentFactory
    {
      private final Context mContext;

      public DummyTabFactory(Context context)
      {
        mContext = context;
      }

      @Override
      public View createTabContent(String tag)
      {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
      }
    }

    public TabManager(TabHost tabHost, int containerId)
    {
      mTabHost = tabHost;
      mContainerId = containerId;
      mTabHost.setOnTabChangedListener(this);
    }

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args)
    {
      tabSpec.setContent(new DummyTabFactory(getActivity()));
      String tag = tabSpec.getTag();

      TabInfo info = new TabInfo(tag, clss, args);

      // Check to see if we already have a fragment for this tab, probably
      // from a previously saved state. If so, deactivate it, because our
      // initial state is that a tab isn't shown.
      info.fragment = getFragmentManager().findFragmentByTag(tag);
      if (info.fragment != null && !info.fragment.isDetached())
      {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(info.fragment);
        ft.commit();
      }

      mTabs.put(tag, info);
      mTabHost.addTab(tabSpec);
    }

    @Override
    public void onTabChanged(String tabId)
    {
      TabInfo newTab = mTabs.get(tabId);
      if (mLastTab != newTab)
      {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        if (mLastTab != null)
        {
          if (mLastTab.fragment != null)
          {
            ft.detach(mLastTab.fragment);
          }
        }
        if (newTab != null)
        {
          if (newTab.fragment == null)
          {
            newTab.fragment = Fragment.instantiate(getActivity(), newTab.clss.getName(), newTab.args);
            ft.add(mContainerId, newTab.fragment, newTab.tag);
          } else
          {
            ft.attach(newTab.fragment);
          }
        }

        mLastTab = newTab;
        ft.commit();
        getFragmentManager().executePendingTransactions();
      }
    }
  }
编辑: 我在单击选项卡后显示/隐藏片段,而不是附加/分离。但我不知道这是否正确。 解决方案:

public class TabManager implements TabHost.OnTabChangeListener
    {
        private final TabHost mTabHost;
        private final int mContainerId;
        private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>();
        TabInfo mLastTab;

        final class TabInfo
        {
            private final String tag;
            private final Class<?> clss;
            private final Bundle args;
            private Fragment fragment;

            TabInfo(String _tag, Class<?> _class, Bundle _args)
            {
                tag = _tag;
                clss = _class;
                args = _args;
            }
        }

        class DummyTabFactory implements TabHost.TabContentFactory
        {
            private final Context mContext;

            public DummyTabFactory(Context context)
            {
                mContext = context;
            }

            @Override
            public View createTabContent(String tag)
            {
                View v = new View(mContext);
                v.setMinimumWidth(0);
                v.setMinimumHeight(0);
                return v;
            }
        }

        public TabManager(TabHost tabHost, int containerId)
        {
            mTabHost = tabHost;
            mContainerId = containerId;
            mTabHost.setOnTabChangedListener(this);
        }

        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args)
        {
            tabSpec.setContent(new DummyTabFactory(getActivity()));
            String tag = tabSpec.getTag();

            TabInfo info = new TabInfo(tag, clss, args);

            // Check to see if we already have a fragment for this tab, probably
            // from a previously saved state. If so, deactivate it, because our
            // initial state is that a tab isn't shown.
            info.fragment = getFragmentManager().findFragmentByTag(tag);
            if (info.fragment != null && !info.fragment.isDetached())
            {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.detach(info.fragment);
                ft.commit();
            }

            mTabs.put(tag, info);
            mTabHost.addTab(tabSpec);
        }

        @Override
        public void onTabChanged(String tabId)
        {
            TabInfo newTab = mTabs.get(tabId);
            if (mLastTab != newTab)
            {
                android.support.v4.app.FragmentTransaction ft = ((FragmentActivity) getActivity()).getSupportFragmentManager().beginTransaction();
                if (mLastTab != null)
                {
                    if (mLastTab.fragment != null)
                    {
                        ft.hide(mLastTab.fragment);

                    }
                }
                if (newTab != null)
                {
                    if (newTab.fragment == null)
                    {
                        newTab.fragment = Fragment.instantiate(getActivity(), newTab.clss.getName(), newTab.args);
                        ft.add(mContainerId, newTab.fragment, newTab.tag);
                    } else
                    {
                        ft.show(newTab.fragment);
                    }
                }

                mLastTab = newTab;
                ft.commit();
                getFragmentManager().executePendingTransactions();
            }
        }
    }

它不会每次都创建一个新片段,它只在片段未附加到选项卡时创建,即newTab.fragment在onTabChanged方法中为null

         if (newTab.fragment == null) {
             newTab.fragment = Fragment.instantiate(mActivity,
             newTab.clss.getName(), newTab.args);
             ft.add(mContainerId, newTab.fragment, newTab.tag);
         } else {
             ft.attach(newTab.fragment);
         }

你能告诉我如何在tabhost上使用它吗?不明白你的问题-它已经在使用tabhost了,对吗?我正在使用这个tabhost和searchview,我需要在单击search时重新创建片段。我不想在更改选项卡时重新创建。