Android 底部导航与Fragment联动的实现

今天我要写的是常见的如微信一类的底部导航与Fragment联动的实现

1,首先,在每一个Fragment里写一个public权限的TAG,保证每个Fragment的TAG唯一。

2,在xml里先好布局:
上半部分是你要放Fragment的地方,下半部分是底部导航放置的地方。下面是我的示例代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <FrameLayout
        android:id="@+id/main_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

    </FrameLayout>

    <RadioGroup
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="@drawable/abc_ab_bottom_transparent_light_holo"
        android:paddingTop="8dp"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/shouye_navigation"
            style="@style/main_navigation"
            android:text="@string/shouYe"
            android:textColor="@drawable/navigation_text_select"
            android:textSize="12sp"
            android:checked="true"
            android:drawableTop="@drawable/icon_shouye_select"
            />

        <RadioButton
            android:id="@+id/fenlei_navigation"
            style="@style/main_navigation"
            android:text="@string/fenLei"
            android:textColor="@drawable/navigation_text_select"
            android:textSize="12sp"
            android:drawableTop="@drawable/icon_fenlei_select"
            />

        <RadioButton
            android:id="@+id/ruanzhuangmofa_navigation"
            style="@style/main_navigation"
            android:text="@string/ruanZhuangMoFa"
            android:textColor="@drawable/navigation_text_select"
            android:textSize="12sp"
            android:drawableTop="@drawable/icon_ruanzhuangmofa_select"
            />

        <RadioButton
            android:id="@+id/gouwuche_navigation"
            style="@style/main_navigation"
            android:text="@string/gouWuChe"
            android:textColor="@drawable/navigation_text_select"
            android:textSize="12sp"
            android:drawableTop="@drawable/icon_gouwuche_select"
            />

        <RadioButton
            android:id="@+id/wo_navigation"
            style="@style/main_navigation"
            android:text="@string/wo"
            android:textColor="@drawable/navigation_text_select"
            android:drawableTop="@drawable/icon_wo_select"
            />

    </RadioGroup>

</LinearLayout>

3,下面是MainActivity的示例代码:

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

    private RadioGroup controller;
    //记录显示着的Fragment
    private Fragment cacheFragment;

    private FragmentManager fm;

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

        initView();
    }

    private void initView() {
        controller = ((RadioGroup) findViewById(R.id.controller));
        controller.setOnCheckedChangeListener(this);

        //获取一个FragmentManager实例
        fm = getSupportFragmentManager();
        //开启一个Fragment事物
        FragmentTransaction transaction = fm.beginTransaction();
        //事物中进行添加操作:
        //①添加的位置,ContainerViewId
        // ②Fragment,我们将要添加的碎片
        //③String TAG,标记,为我们添加到Container中的Fragment添加标记.
        cacheFragment = new PageOneFragment();
        transaction.add(R.id.container, cacheFragment, PageOneFragment.TAG);
        //提交事务
        transaction.commit();
    }


    /**
     * 当选中上网child改变的时候,就会回掉
     * 不管child改变的来源,举个例子,由外界条件改变,造成RadioGroup中的子View改变
     * 一个Button,控制选中状态改变,同样会回掉onCheckChange的方法。
     * TODO:Fragment的hide,show
     * ①将显示着的Fragment隐藏
     * ②将要加载的Fragment显示出来
     *
     * @param group
     * @param checkedId
     */
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId) {
            case R.id.controller_one:
                /*//开启一个Fragment事物
                FragmentTransaction transaction = fm.beginTransaction();
                //隐藏显示着的Fragment
                if (cacheFragment!=null){
                    transaction.hide(cacheFragment);
                }
                //加载要显示的Fragment
                *//**
             * ①根据TAG,去查找Fragment
             * ②如果根据TAG成功找到Fragment,我们就将目标Fragment显示出来。
             * ③如果根据TAG未找到Fragment,则会返回给我们一个null,我们就需要
             *      实例化一个Fragment,显示出来,并记录下来
             *//*
                cacheFragment=fm.findFragmentByTag(PageOneFragment.TAG);
                if (cacheFragment!=null){
                    transaction.show(cacheFragment);
                }else{
                    cacheFragment=new PageOneFragment();
                    transaction.add(R.id.container,cacheFragment,PageOneFragment.TAG);
                }
                //提交事务
                transaction.commit();*/
                switchPage(PageOneFragment.TAG, PageOneFragment.class);
                break;
            case R.id.controller_two:
                switchPage(PageTwoFragment.TAG, PageTwoFragment.class);
                break;
            case R.id.controller_three:
                switchPage(PageTreeFragment.TAG, PageTreeFragment.class);
                break;
            case R.id.controller_four:
                switchPage(PageFourFragment.TAG, PageFourFragment.class);
                break;
        }
    }


    private void switchPage(String tag, Class<? extends Fragment> cls) {
        //开启一个Fragment事物
        FragmentTransaction transactionFour = fm.beginTransaction();
        //隐藏显示着的Fragment
        if (cacheFragment != null) {
            transactionFour.hide(cacheFragment);
        }
        //加载要显示的Fragment
        /**
         * ①根据TAG,去查找Fragment
         * ②如果根据TAG成功找到Fragment,我们就将目标Fragment显示出来。
         * ③如果根据TAG未找到Fragment,则会返回给我们一个null,我们就需要
         *      实例化一个Fragment,显示出来,并记录下来
         */
        cacheFragment = fm.findFragmentByTag(tag);
        if (cacheFragment != null) {
            transactionFour.show(cacheFragment);
        } else {
            try {
                //通过反射,使用无参构造一个Fragment实例
                cacheFragment = cls.getConstructor().newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            transactionFour.add(R.id.container, cacheFragment, tag);
        }
        //提交事务
        transactionFour.commit();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章