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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章