Fragment管理的工具类

来源:互联网 发布:php php_self 编辑:程序博客网 时间:2024/06/05 08:11

对于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;        }    }}

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


资源下载地址

点击下载






0 0
原创粉丝点击