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

来源:互联网 发布:翼支付企业版下载软件 编辑:程序博客网 时间:2024/06/07 09:02

今天我要写的是常见的如微信一类的底部导航与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();    }}
1 0