Fragment管理的工具类

本文介绍了一种通过自定义适配器管理Fragment的方法,包括如何添加Fragment、切换Fragment以及实现延时加载的功能。适用于需要灵活管理多个Fragment的应用场景。

对于Fragment的使用,如果是用ViewPager加载的话,管理起来很方便,因为只有继承FragmentPagerAdapter,修改一点东西就可以了。


但是如果是FragmentManger,使用add()、hide()管理起来有点麻烦。于是我就仿FragmentPagerAdapter,写了一个SHFragmentAdapter管理显示的fragment


可以延时加载的。


其实很简单而已,下面是代码


SHFragmentAdapter

package com.example.administrator.frag;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

import java.util.ArrayList;
import java.util.List;

/**
 * 通过show hide 显示Fragment的适配器,可以延时加载,只有使用AbsFragment才有用
 * Created by Administrator on 2015/6/17.
 */
public class SHFragmentAdapter {

    private FragmentManager mFragmentManager = null;
    private List<PageInfo> mTabs = null;
    private int containerId = 0;
    private Context mContext = null;
    private Fragment mCurrentPrimaryItem = null;
    private OnPageChangeListener onPageChangeListener;

    public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) {
        this.onPageChangeListener = onPageChangeListener;
    }

    public SHFragmentAdapter(FragmentManager manager, int contentId, Context context) {
        this.mFragmentManager = manager;
        this.containerId = contentId;
        mContext = context;
        mTabs = new ArrayList<PageInfo>(2);
    }

    /**
     *
     * @param tag
     * @param clasz
     * @param bundle
     */
    public void addTag(String tag, Class<? extends Fragment> clasz, Bundle bundle) {
        mTabs.add(new PageInfo(null, tag, clasz, bundle));
    }

    private Fragment getItem(int position) {
        PageInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    public long getItemId(int position) {
        return position;
    }

//    private void setPrimaryItem(Fragment fragment) {
//        if (fragment != mCurrentPrimaryItem) {
//            if (mCurrentPrimaryItem != null) {
//                mCurrentPrimaryItem.setMenuVisibility(false);
//                mCurrentPrimaryItem.setUserVisibleHint(false);
//            }
//            if (fragment != null) {
//                fragment.setMenuVisibility(true);
//                fragment.setUserVisibleHint(true);
//            }
//            mCurrentPrimaryItem = fragment;
//        }
//    }


//    private Fragment instantiateItem(int containerId, int position) {
//        final long itemId = getItemId(position);
//        // Do we already have this fragment?
//        String name = makeFragmentName(containerId, itemId);
//        Fragment fragment = mFragmentManager.findFragmentByTag(name);
//        if (fragment == null) {
//            fragment = getItem(position);
//            FragmentTransaction transaction = mFragmentManager.beginTransaction();
//            transaction.add(containerId, fragment, makeFragmentName(containerId, itemId));
//            transaction.commitAllowingStateLoss();
//        }
//        return fragment;
//    }


    public Fragment getCurrentItem() {
        return mCurrentPrimaryItem;
    }

    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }

    public void setCurrentItem(int position) {
        final long itemId = getItemId(position);
        // Do we already have this fragment?
        String name = makeFragmentName(containerId, itemId);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null && fragment == mCurrentPrimaryItem) {
            return;
        }

        FragmentTransaction transaction = mFragmentManager.beginTransaction();

        if (fragment == null) {
            fragment = getItem(position);
            transaction.add(containerId, fragment, makeFragmentName(containerId, itemId));
        }

        if (mCurrentPrimaryItem != null) {
            transaction.hide(mCurrentPrimaryItem);
        }

        transaction.show(fragment);
        transaction.commitAllowingStateLoss();

        if (mCurrentPrimaryItem != null) {
            mCurrentPrimaryItem.setMenuVisibility(false);
            mCurrentPrimaryItem.setUserVisibleHint(false);
        }

        if (fragment != null) {
            fragment.setMenuVisibility(true);
            fragment.setUserVisibleHint(true);
        }
        mCurrentPrimaryItem = fragment;
        if (onPageChangeListener != null) {
            onPageChangeListener.onPageChangeAfter(position);
        }
    }

    public interface OnPageChangeListener {
        public void onPageChangeAfter(int position);
    }
}

添加Fragment通过   addTag, 切换时可以调用  setCurrentItem,就可以切换到不同fragment。


下面是AbsFragment


package com.example.administrator.frag;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2015/5/28.
 */
public abstract class AbsFragment extends Fragment {

    public static final byte INIT_NOT = 0x00;  //未加载
    public static final byte INIT_ING = 0x01;  //加载中
    public static final byte INIT_FINISH = 0x02;  //加载完成

    protected View mRootView;
    protected byte initState = INIT_NOT;

    protected abstract int getLayoutId();

    //第一次可见加载
    protected abstract void onFirstVisiableLoad();

    private Handler mPriHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:  //可见
                    onVisiable();
                    break;
                case 2: //不可见
                    onInvisiable();
                    break;
                case 3: //第一次加载
                    if (initState == INIT_NOT) {
                        initState = INIT_ING;
                        onFirstVisiableLoad();
                        initState = INIT_FINISH;
                        mPriHandler.sendEmptyMessage(1);
                    }
                    break;
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRootView = inflater.inflate(getLayoutId(), container, false);
        return mRootView;
    }


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            if (initState == INIT_FINISH) {
                mPriHandler.sendEmptyMessage(1);
            } else if (initState == INIT_NOT) {
                mPriHandler.sendEmptyMessageDelayed(3, 100);//延迟0.1秒加载
            }
        } else {
            if (initState == INIT_FINISH) {
                mPriHandler.sendEmptyMessage(2);
            } else {
                mPriHandler.removeMessages(3);
            }
        }
    }

    //当可见
    protected void onVisiable() {
    }

    //当不可见
    protected void onInvisiable() {
    }

    public View findViewById(int id) {
        if (mRootView != null) {
            return mRootView.findViewById(id);
        }
        return null;
    }
}

下面是使用方法


package com.example.administrator.frag;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;

import com.example.administrator.frag.page.FragOne;
import com.example.administrator.frag.page.FragTwo;


public class FragActivity extends ActionBarActivity implements View.OnClickListener {


    SHFragmentAdapter adapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frag_main);


        adapter = new SHFragmentAdapter(getSupportFragmentManager(), R.id.container, this);

        adapter.addTag("one", FragOne.class, null);
        adapter.addTag("two", FragTwo.class, null);
        adapter.setCurrentItem(0);

        findViewById(R.id.one).setOnClickListener(this);
        findViewById(R.id.two).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.one:
                adapter.setCurrentItem(0);
                break;
            case R.id.two:
                adapter.setCurrentItem(1);
                break;
        }
    }

}

如果有什么问题,请指教。


资源下载地址

点击下载






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值