您的位置:首页 > 移动开发 > Android开发

Fragment 与FragmentActivity通信封装

2016-06-02 17:23 447 查看
在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActivity进一步封装,那在实际开发中只需要继承父类,然后调用一个方法就可以实现Fragment之间界面切换和值传递

1、FragmentActivity类的封装

[java] view
plain copy

 print?

<span style="font-size:14px;">public class BaseChangeFragments extends BaseActivity {  

  

    protected FragmentManager mFragmentManager;  

    protected FragmentTransaction mFragmentTransaction;  

  

    protected String mCurrentFragmentTag;  

    protected Map<String, BaseFragment> mapFragments = new HashMap<String, BaseFragment>();  

  

    @Override  

    protected void beforeCreate() {  

        super.beforeCreate();  

        mFragmentManager = getSupportFragmentManager();  

    }  

  

    protected FragmentTransaction ensureTransaction() {  

        if (mFragmentTransaction == null) {  

            mFragmentTransaction = mFragmentManager.beginTransaction();  

            // mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  

            // mFragmentTransaction.addToBackStack(null);  

            mFragmentTransaction  

                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  

        }  

  

        return mFragmentTransaction;  

    }  

  

    protected BaseFragment getFragment(String tag) {  

        BaseFragment f = (BaseFragment) (mFragmentManager  

                .findFragmentByTag(tag));  

        if (f == null) {  

            // 在这里判断tag,不同则实例化对应的fragment  

            f = mapFragments.get(tag);  

        }  

        return f;  

    }  

  

    protected void attachFragment(int layout, Fragment f, String tag) {  

        if (f != null) {  

            if (f.isDetached()) {  

                ensureTransaction();  

                mFragmentTransaction.attach(f);  

            } else if (!f.isAdded()) {  

                ensureTransaction();  

                mFragmentTransaction.add(layout, f, tag);  

            }  

        }  

    }  

  

    protected void detachFragment(Fragment f) {  

        if (f != null && !f.isDetached()) {  

            ensureTransaction();  

            mFragmentTransaction.detach(f);  

        }  

    }  

  

    /** 

     * @param layout 

     * @param f 

     * @param tag 

     */  

    protected void showFragment(int layout, BaseFragment f, String tag) {  

        if (f != null) {  

            if (!f.isAdded()) {  

                ensureTransaction();  

                f.updateNet();  

                mFragmentTransaction.add(layout, f, tag);  

            } else {  

                ensureTransaction();  

                f.updateNet();  

                mFragmentTransaction.show(f);  

            }  

        }  

    }  

  

    /** 

     * 进行传值 

     *  

     * @param layout 

     * @param f 

     * @param tag 

     * @param bundle 

     */  

    protected void showFragment(int layout, BaseFragment f, String tag,  

            Bundle bundle) {  

        if (f != null) {  

            if (!f.isAdded()) {  

                ensureTransaction();  

                f.updateNet(bundle);  

                mFragmentTransaction.add(layout, f, tag);  

            } else {  

                ensureTransaction();  

                f.updateNet(bundle);  

                mFragmentTransaction.show(f);  

            }  

        }  

    }  

  

    protected void hideFragment(Fragment f) {  

        if (f != null) {  

            if (f.isAdded()) {  

                ensureTransaction();  

                mFragmentTransaction.hide(f);  

            }  

        }  

    }  

  

    protected void commitTransactions() {  

        if (mFragmentTransaction != null && !mFragmentTransaction.isEmpty()) {  

            mFragmentTransaction.commit();  

            mFragmentTransaction = null;  

        }  

    }  

  

    /** 

     * 采用attach和detach来实现fragment的切换,每一次都会进入onCreateView 

     *  

     * @param tag 

     */  

    protected void switchFragmenCreate(String tag) {  

        if (TextUtils.equals(mCurrentFragmentTag, tag))  

            return;  

        if (mCurrentFragmentTag != null)  

            detachFragment(getFragment(mCurrentFragmentTag));  

        attachFragment(R.id.container, getFragment(tag), tag);  

        mCurrentFragmentTag = tag;  

        commitTransactions();  

    }  

  

    /** 

     * 采用show和hide来实现fragment的切换,只有第一次都会进入onCreateView 

     *  

     * @param tag 

     */  

    protected void switchFragmen(String tag) {  

        if (TextUtils.equals(mCurrentFragmentTag, tag))  

            return;  

        if (mCurrentFragmentTag != null)  

            hideFragment(getFragment(mCurrentFragmentTag));  

        showFragment(R.id.container, getFragment(tag), tag);  

        mCurrentFragmentTag = tag;  

        commitTransactions();  

    }  

      

    /** 

     * 切换界面,通过bundle来传值 

     * @param tag 

     * @param bundle 

     */  

    protected void switchFragmen(String tag, Bundle bundle) {  

        if (TextUtils.equals(mCurrentFragmentTag, tag))  

            return;  

        if (mCurrentFragmentTag != null)  

            hideFragment(getFragment(mCurrentFragmentTag));  

        showFragment(R.id.container, getFragment(tag), tag, bundle);  

        mCurrentFragmentTag = tag;  

        commitTransactions();  

    }  

  

}</span>  

上面包含了三种切换方式分别是:(1)attach和detach (2)show和hide -- 不传值(3)show和hide--传值

其中传值方式采用接口回调的方式实现,比如下面这个方法:

[java] view
plain copy

 print?

<span style="font-size:14px;">/** 

     * 进行传值 

     *  

     * @param layout 

     * @param f 

     * @param tag 

     * @param bundle 

     */  

    protected void showFragment(int layout, BaseFragment f, String tag,  

            Bundle bundle) {  

        if (f != null) {  

            if (!f.isAdded()) {  

                ensureTransaction();  

                f.updateNet(bundle);  --采用接口回调告知fragment显示以及更新数据两个功能  

                mFragmentTransaction.add(layout, f, tag);  

            } else {  

                ensureTransaction();  

                f.updateNet(bundle);  

                mFragmentTransaction.show(f);  

            }  

        }  

    }</span>  

其中里面BaseActivity这个类是在我的项目的基础类,我把onCreate里面的添加的空方法写出来

[java] view
plain copy

 print?

<span style="font-size:14px;">@Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        startIntent = new Intent();  

        beforeCreate();  

        LogUtils.customTagPrefix = "IDPoc";  

        initView();  

        initListener();  

        initData();  

    }  

</span>  

回调接口如下:

[java] view
plain copy

 print?

<span style="font-size:14px;">public interface IFragmentChange {  

    void setId(String id, Bundle bundle);  

}</span>  

在Fragment类中实现:

[java] view
plain copy

 print?

<span style="font-size:14px;"></span><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:14px;"><span style="color: #bb2ca2">private</span> IFragmentChange mFragmentChange;</span></p><span style="font-size:14px;">@Override  

    public void onAttach(Activity activity) {  

        super.onAttach(activity);  

        mFragmentChange = (IFragmentChange) activity;  

    }  

  

    @Override  

    public void onDetach() {  

        super.onDetach();  

        mFragmentChange = null;  

    }  

</span>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息