Fragment管理工具类

分享一个之前项目自己写的一个Fragment切换工具类

  • 首先是工具类的代码,工具类封装了Fragment的切换,添加、销毁、状态保存等方法
public class FragmentTabManager {
    private Context mContext;
    private FragmentManager mFragmentManager;
    private int mContainerId;
    private ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private TabInfo mLastTab;//当前手机显示的选项卡
    private TabHost.OnTabChangeListener mOnTabChangeListener;

    public FragmentTabManager(Context context, FragmentManager fragmentManager, int containerId) {
        mContext = context;
        mFragmentManager = fragmentManager;
        mContainerId = containerId;
    }

    /**
     * 添加选项卡
     *
     * @param tag   fragment的tag
     * @param clazz fragment的class
     * @param args  fragment参数
     * @return
     */
    public FragmentTabManager addTab(String tag, Class<?> clazz, Bundle args) {
        TabInfo tabInfo = new TabInfo(tag, clazz, args);
        mTabs.add(tabInfo);
        return this;
    }

    /**
     * 获取当前的fragment
     *
     * @return
     */
    public Fragment getCurrentFragment() {
        return mLastTab == null ? null : mLastTab.fragment;
    }

    /**
     * 获取当前选项卡的tag
     *
     * @return
     */
    public String getCurrentTag() {
        return mLastTab == null ? null : mLastTab.tag;
    }

    /**
     * 设置tab变化监听
     *
     * @param listener
     */
    public void setOnTabChangedListener(TabHost.OnTabChangeListener listener) {
        mOnTabChangeListener = listener;
    }

    /**
     * 解除当前fragment的viewTree
     */
    public void detach() {
        if (mLastTab != null) {
            if (mLastTab.fragment != null) {
                mFragmentManager.beginTransaction().detach(mLastTab.fragment).commit();
            }
            mLastTab = null;
        }
    }

    /**
     * 保存fragment的状态
     *
     * @param tabId
     */
    public void restoreTab(String tabId) {
        TabInfo newTab = null;
        for (int i = 0; i < mTabs.size(); i++) {
            TabInfo tab = mTabs.get(i);
            tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
            if (tabId.equals(tab.tag)) {
                newTab = tab;
            }
        }
        mLastTab = newTab;
    }

    /**
     * 根据tabId切换fragment
     *
     * @param tabId 需要显示的fragment的tabId
     */
    public void changeTab(String tabId) {
        FragmentTransaction ft = doTabChange(tabId, null);
        if (ft != null)
            ft.commit();
        if (mOnTabChangeListener != null)
            mOnTabChangeListener.onTabChanged(tabId);
    }


    private FragmentTransaction doTabChange(String tabId, FragmentTransaction ft) {
        TabInfo newTab = null;
        for (int i = 0; i < mTabs.size(); i++) {
            TabInfo tabInfo = mTabs.get(i);
            if (tabInfo.tag.equalsIgnoreCase(tabId)) {
                newTab = tabInfo;
            }
        }
        if (newTab == null)
            throw new IllegalStateException("Tab NotFind" + tabId);
        if (mLastTab != newTab) {
            if (ft == null)
                ft = mFragmentManager.beginTransaction();
            if (mLastTab != null) {
                if (mLastTab.fragment != null) {
                    ft.hide(mLastTab.fragment);
                }
            }
            if (newTab.fragment == null) {
                newTab.fragment = Fragment.instantiate(mContext, newTab.clazz.getName(), newTab.args);
                ft.add(mContainerId, newTab.fragment, newTab.tag);
            } else {
                ft.show(newTab.fragment);
            }
            mLastTab = newTab;
        }

        return ft;
    }

    /**
     * fragment的销毁
     *
     * @param tabId 需要销毁fragment的id
     */
    public void destory(String tabId) {
        TabInfo newTab = null;
        for (int i = 0; i < mTabs.size(); i++) {
            TabInfo tab = mTabs.get(i);
            if (tab.tag.equals(tabId)) {
                newTab = tab;
            }
        }
        if (newTab == null) {
            throw new IllegalStateException("Tab NotFind" + tabId);
        }
        if (newTab.fragment != null) {
            FragmentTransaction ft = mFragmentManager.beginTransaction();
            ft.remove(newTab.fragment).commitAllowingStateLoss();
            newTab.fragment = null;
        }
        if (newTab == mLastTab) {
            mLastTab = null;
        }
    }

    /**
     * 选项卡类
     */
    class TabInfo {
        private String tag;
        private Class<?> clazz;
        private Bundle args;
        private Fragment fragment;

        public TabInfo(String tag, Class<?> clazz, Bundle args) {
            this.tag = tag;
            this.clazz = clazz;
            this.args = args;
        }
    }
}
  • 客户端代码比较,定义需要添加的Fargment的tag,通过FragmentTabManager的addTab( )方法添加Fragment,通过FragmentTabManager中的setOnTabChangedListener( )方法设置选项卡切换监听,并实现onTabChanged方法,实现比较简单,就是简单的比较一下当前选中的tabID跟开始定义的tag。
public class MainActivity extends FragmentActivity {
    private FragmentTabManager mFragmentTabManager;
    private final String WEDDING_MAIN = "main",
            WEDDING_SERVICE = "service",
            WEDDING_SHOW = "show",
            WEDDING_USER = "user";
    private TextView mTv_main, mTv_service, mTv_show, mTv_user;

    private View.OnClickListener mOnClickListener=new View.OnClickListener() {
        @Override
        public void onClick(View v) {
      switch (v.getId()){
          case R.id.tv_main:
              mFragmentTabManager.changeTab(WEDDING_MAIN);
              break;
          case R.id.tv_service:
              mFragmentTabManager.changeTab(WEDDING_SERVICE);
              break;
          case R.id.tv_show:
              mFragmentTabManager.changeTab(WEDDING_SHOW);
              break;
          case R.id.tv_user:
              mFragmentTabManager.changeTab(WEDDING_USER);
              break;
      }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv_main = (TextView) findViewById(R.id.tv_main);
        mTv_service = (TextView) findViewById(R.id.tv_service);
        mTv_show = (TextView) findViewById(R.id.tv_show);
        mTv_user = (TextView) findViewById(R.id.tv_user);
        mTv_main.setOnClickListener(mOnClickListener);
        mTv_service.setOnClickListener(mOnClickListener);
        mTv_show.setOnClickListener(mOnClickListener);
        mTv_user.setOnClickListener(mOnClickListener);

        mFragmentTabManager = new FragmentTabManager(this, getSupportFragmentManager(), R.id.fra_contain);
        mFragmentTabManager.addTab(WEDDING_MAIN, MainFragment.class, null)
                .addTab(WEDDING_SERVICE, ServiceFragment.class, null)
                .addTab(WEDDING_SHOW, ShowFragment.class, null)
                .addTab(WEDDING_USER, UserFragment.class, null);
        mFragmentTabManager.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
            @Override
            public void onTabChanged(String tabId) {
                MainActivity.this.onTabChange(tabId);
            }
        });
        if (savedInstanceState == null) {
            mFragmentTabManager.changeTab(WEDDING_MAIN);
        } else {
            String tabId = savedInstanceState.getString("tab");
            onTabChange(tabId);
        }
    }

    private void onTabChange(String tabId) {
        mTv_main.setSelected(tabId.equals(WEDDING_MAIN));
        mTv_service.setSelected(tabId.equals(WEDDING_SERVICE));
        mTv_show.setSelected(tabId.equals(WEDDING_SHOW));
        mTv_user.setSelected(tabId.equals(WEDDING_USER));

    }

猜你喜欢

转载自blog.csdn.net/ww55555577/article/details/80063624