Fragment创建添加切换和对应底部导航(一)

示例一:

效果如图所示

每一个Fragment显示一个字符串,比如

在所有的例子里面,都有四个简单Fragment,分别为FragmentA,FragmentB,FragmentC,FragmentD。。

类的内容

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_a, container, false);
    }

布局文件就是FrameLayout中有一个TextView。

MainActivity继承自FragmentActivity,其布局文件内容可以看出下面四个导航按钮是RadioButton

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

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

    </FrameLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/devider_line" >
    </View>

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="10dp" >

        <RadioButton
            android:id="@+id/btn_stimulation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@null"
            android:button="@null"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/stimulation"
            android:gravity="center_horizontal"
            android:text="@string/tab_stimulation"
            android:textColor="@color/yellow" />
        <RadioButton
            android:id="@+id/btn_prescription"            ............. />

        <RadioButton
            android:id="@+id/btn_network"            .............. />

        <RadioButton
            android:id="@+id/btn_setting"             ........ />

    </RadioGroup>

</LinearLayout>

使用ButterKnife获取控件对象

    @BindView(R.id.content)
    FrameLayout content;
    @BindView(R.id.btn_stimulation)
    RadioButton btnStimulation;
    ............
    @BindView(R.id.radioGroup)
    RadioGroup radioGroup;

在初始化时添加radioGroup的点击响应事件

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
                switch (checkedId) {
                    case R.id.btn_stimulation:
                        selectNavigation(0);
                        break;
                    case R.id.btn_prescription:
                        selectNavigation(1);
                     ........
                }
            }
        });

 按钮选择函数selectNavigation就是先将四个变灰色,再把选择的变成彩色,设置选中,同时调用Fragment选择函数,在onCreate中调用selectNavigation(0)。

    private void selectNavigation(int page) {
        //四个导航按钮绘制成灰色
        for (int i = 0; i < radioGroup.getChildCount(); i++) {
            Drawable grey_image = getResources().getDrawable(greyed[i]);
            grey_image.setBounds(0, 0, grey_image.getMinimumWidth(),
                    grey_image.getMinimumHeight());
            RadioButton child = (RadioButton) radioGroup.getChildAt(i);
            child.setCompoundDrawables(null, grey_image, null, null);
            child.setTextColor(getResources().getColor(
                    R.color.dark_gray));

        }
        //将指定按钮绘制成彩色,并设置选中
        Drawable yellow = getResources().getDrawable(colored[page]);
        yellow.setBounds(0, 0, yellow.getMinimumWidth(),
                yellow.getMinimumHeight());
        RadioButton select = (RadioButton) radioGroup.getChildAt(page);
        select.setCompoundDrawables(null, yellow, null, null);
        select.setTextColor(getResources().getColor(
                R.color.yellow));
        select.setChecked(true);

        // 选择导航的时候,同时选择Fragment
        showFragment(page);
    }

其中greyed和colored就是底部四个灰色和彩色资源文件id数组。

 

Fragment的声明,创建和显示

 

    FragmentA fragmentA;
    FragmentB fragmentB;
    FragmentC fragmentC;
    FragmentD fragmentD;
    List<Fragment> fragments = new ArrayList<Fragment>();

在onCreate的时候创建Fragment,调用InitFragments

    private void InitFragments() {
        fragments.clear();

        if (fragmentA == null) {
            fragmentA = new FragmentA();
        }
        if (fragmentB == null) {
            fragmentB = new FragmentB();
        }
        if (fragmentC == null) {
            fragmentC = new FragmentC();
        }
        if (fragmentD == null) {
            fragmentD = new FragmentD();
        }
        fragments.add(fragmentA);
        fragments.add(fragmentB);
        fragments.add(fragmentC);
        fragments.add(fragmentD);
        for (Fragment frag : fragments) {
            if (!frag.isAdded()) {
                getSupportFragmentManager().beginTransaction().add(R.id.content, frag).commit();
            }
        }
    }

在切换导航的时候同时调用切换Fragment函数

    private void showFragment(int frag) {
        //首先隐藏所有Fragments
        for (Fragment f : fragments) {
            getSupportFragmentManager().beginTransaction().hide(f).commit();
        }
        //获取当前 序号的fragment
        Fragment current_frag = fragments.get(frag);
        if (current_frag != null) {
            getSupportFragmentManager().beginTransaction().show(current_frag).commit();

        }

    }

 示例二:修改底部导航。

使用LinearLayout,效果如下

 

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

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

    </FrameLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="55dp">

        <View
            android:layout_width="wrap_content"
            android:layout_height="1dp"
            android:background="?android:listDivider"
            />
        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:background="@android:color/white"
            android:layout_height="54dp">

            <LinearLayout
                android:id="@+id/ll_home"
                android:layout_width="0dp"
                android:padding="4dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/iv_home"
                    android:layout_width="28dp"
                    android:layout_height="28dp"
                    android:src="@drawable/bid02"
                    tools:ignore="ContentDescription" />

                <TextView
                    android:id="@+id/tv_home"
                    android:textColor="@color/home_back_unselected"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="首页"
                    android:layout_marginTop="2dp"
                    android:textSize="14sp"/>
            </LinearLayout>
            <LinearLayout
                android:id="@+id/ll_invest"
                android:layout_width="0dp"
                android:padding="4dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/iv_invest"
                    android:layout_width="28dp"
                    android:layout_height="28dp"
                    android:src="@drawable/bid04" />

                <TextView
                    android:id="@+id/tv_invest"
                    android:textColor="@color/home_back_unselected"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="二页"
                    android:layout_marginTop="2dp"
                    android:textSize="14sp"/>
            </LinearLayout>
            <LinearLayout
                android:id="@+id/ll_me"
                android:layout_width="0dp"
                android:padding="4dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/iv_me"
                    android:layout_width="28dp"
                    android:layout_height="28dp"
                    android:src="@drawable/bid06" />

                <TextView
                    android:id="@+id/tv_me"
                    android:textColor="@color/home_back_unselected"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="三页"
                    android:layout_marginTop="2dp"
                    android:textSize="14sp"/>
            </LinearLayout>-
            <LinearLayout
                android:id="@+id/ll_more"
                android:layout_width="0dp"
                android:padding="4dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/iv_more"
                    android:layout_width="28dp"
                    android:layout_height="28dp"
                    android:src="@drawable/bid08" />

                <TextView
                    android:id="@+id/tv_more"
                    android:textColor="@color/home_back_unselected"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="四页"
                    android:layout_marginTop="2dp"
                    android:textSize="14sp"/>
            </LinearLayout>

        </LinearLayout>
        </LinearLayout>
</LinearLayout>

 使用ButterKnife来响应四个LinearLayout按钮的点击操作

    @OnClick({R.id.ll_home,R.id.ll_invest,R.id.ll_me,R.id.ll_more})
    public void changeTab(View view){
        switch (view.getId()){
            case R.id.ll_home:
                selectNavigation(0);
                break;
            case R.id.ll_invest:
                selectNavigation(1);
                break;
            case R.id.ll_me:
                selectNavigation(2);
                break;
            case R.id.ll_more:
                selectNavigation(3);
                break;
        }
    }
    private void selectNavigation(int page) {
        //相关图片,字体变成灰色
        ivHome.setImageResource(R.drawable.bid02);
        ivInvest.setImageResource(R.drawable.bid04);
        ivMe.setImageResource(R.drawable.bid06);
        ivMore.setImageResource(R.drawable.bid08);
        tvHome.setTextColor(getResources().getColor(R.color.home_back_unselected));
        tvInvest.setTextColor(getResources().getColor(R.color.home_back_unselected));
        tvMe.setTextColor(getResources().getColor(R.color.home_back_unselected));
        tvMore.setTextColor(getResources().getColor(R.color.home_back_unselected));


        switch (page) {
            case 0:
                ivHome.setImageResource(R.drawable.bid01);
                tvHome.setTextColor(getResources().getColor(R.color.home_back_selected_green));
                break;
            case 1:
                ivInvest.setImageResource(R.drawable.bid03);
                tvInvest.setTextColor(getResources().getColor(R.color.home_back_selected_green));
                break;
            case 2:
                ivMe.setImageResource(R.drawable.bid05);
                tvMe.setTextColor(getResources().getColor(R.color.home_back_selected_green));
                break;
            case 3:
                ivMore.setImageResource(R.drawable.bid07);
                tvMore.setTextColor(getResources().getColor(R.color.home_back_selected_green));
                break;
        }

        // 选择导航的时候,同时选择Fragment
        showFragment(page);
    }

 

posted on 2018-11-27 09:08  legion  阅读(249)  评论(0编辑  收藏  举报

导航