Android 主界面多个Tab栏的实现

前言

现在比较流行的就是类似qq或者微信上的布局,都是在底部都几个Tab栏,点击不同的Tab栏可以切换不同的页面,大概的实现原理就是使用RadioGroup包裹几个RadioButton来实现的,而不同的页面展示则是放置一个FrameLayout来实现的。

效果图:

这里写图片描述

1.代码布局:

顶部设置了标题,使用的是现在都在用的toolBar,可以在切换不同页面的时候设置不同的标题。然后下面放了一个Radiogroup,里面包裹了四个RadioButton实现不同页面的切换。里面的View控件是设置的水平的分割线,使页面好看点

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.Toolbar
        xmlns:toolbar="http://schemas.android.com/apk/res-auto"
        android:id="@+id/index_title_tb"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/colorPrimaryDark"
        toolbar:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        toolbar:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <TextView
            android:id="@+id/index_title_tv"
            style="@style/title_text_style"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="@color/white"
            android:text="我是标题"/>
    </android.support.v7.widget.Toolbar>


    <View
        android:id="@+id/index_title_divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_below="@id/index_title_tb"
        android:background="@drawable/common_horizontal_divider"/>
    <RadioGroup
        android:id="@+id/index_bottom_navigation_rg"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:layout_alignParentBottom="true"
        android:background="@color/white"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/index_tab_a_rb"
            style="@style/Index_tab_style"
            android:drawableTop="@drawable/index_equipment_tab_sel"
            android:text="@string/index_tab_equipment"/>

        <RadioButton
            android:id="@+id/index_tab_b_rb"
            style="@style/Index_tab_style"
            android:drawableTop="@drawable/index_bill_tab_sel"
            android:text="@string/index_tab_bill"/>

        <RadioButton
            android:id="@+id/index_tab_c_rb"
            style="@style/Index_tab_style"
            android:drawableTop="@drawable/index_contract_tab_sel"
            android:text="@string/index_tab_contract"/>


        <RadioButton
            android:id="@+id/index_tab_d_rb"
            style="@style/Index_tab_style"
            android:drawableTop="@drawable/index_setting_tab_sel"
            android:text="@string/index_tab_setting"/>

    </RadioGroup>

    <View
        android:id="@+id/index_bottom_divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_above="@id/index_bottom_navigation_rg"
        android:background="@drawable/common_horizontal_divider"/>

    <FrameLayout
        android:id="@+id/index_content_fl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/index_bottom_divider"
        android:layout_below="@id/index_title_divider"
        android:background="@color/white"/>

</RelativeLayout>

2.Java代码控制不同页面切换

package com.css.demo;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;

import com.css.demo.ui.index.TabA;
import com.css.demo.ui.index.TabB;
import com.css.demo.ui.index.TabC;
import com.css.demo.ui.index.TabD;
import com.css.demo.utils.L;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Created by cssch on 2016/10/11.
 */

public class IndexActivity extends BaseIndexActivity {

    @Bind(R.id.index_tab_a_rb)//第一页tab按钮
            RadioButton indexTabARb;

    @Bind(R.id.index_tab_b_rb)//第二页tab按钮
            RadioButton indexTabBRb;

    @Bind(R.id.index_tab_c_rb)//第三页tab按钮
            RadioButton indexTabCRb;

    @Bind(R.id.index_tab_d_rb)//第四页tab按钮
            RadioButton indexTabDRb;

    @Bind(R.id.index_title_tv)//标题
            TextView indexTitleTv;

    private static final int TABA = 1;//第一页标记
    private static final int TABB = 2;//第二页标记
    private static final int TABC = 3;//第三页标记
    private static final int TABD = 4;//第四页标记

    //这里的是四个Fragment的说明
    private TabA tabA;//第一页
    private TabB tabB;//第二页
    private TabC tabC;//第三页
    private TabD tabD;//第四页

    private Context context;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        L.d("myname".toString());
        setContentView(R.layout.index);
        ButterKnife.bind(this);
        context = IndexActivity.this;
        //设置四个Tab栏的监听
        indexTabARb.setOnCheckedChangeListener(new OnNaviCheckChangeListener(TABA));
        indexTabBRb.setOnCheckedChangeListener(new OnNaviCheckChangeListener(TABB));
        indexTabCRb.setOnCheckedChangeListener(new OnNaviCheckChangeListener(TABC));
        indexTabDRb.setOnCheckedChangeListener(new OnNaviCheckChangeListener(TABD));
        //设置默认的显示页面为b页面
        indexTabBRb.setChecked(true);
    }

    /**
     * 监听事件的实现
     */
    class OnNaviCheckChangeListener implements CompoundButton.OnCheckedChangeListener {

        private int position;

        public OnNaviCheckChangeListener(int position) {

            this.position = position;
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {

                changeTab(position);
            }
        }
    }

    /**
     * @param position 切换tab
     */
    public void changeTab(int position) {

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        hideFragments(transaction);
        switch (position) {
            case TABA:
                changeToTabA(transaction);
                break;
            case TABB:
                changeToTabB(transaction);
                break;
            case TABC:
                changeToTabC(transaction);
                break;
            case TABD:
                changeToTabD(transaction);
                break;
            default:
                changeToTabA(transaction);
                break;
        }
        transaction.commitAllowingStateLoss();
    }

    /**
     * 跳转到tabA
     *
     * @param transaction
     */
    private void changeToTabA(FragmentTransaction transaction) {
        indexTitleTv.setText("TabA页面");
        if (tabA == null) {
            tabA = new TabA();
            transaction.add(R.id.index_content_fl, tabA);
        } else {
            transaction.show(tabA);
        }
    }

    /**
     * 跳转到tabB
     *
     * @param transaction
     */
    private void changeToTabB(FragmentTransaction transaction) {
        indexTitleTv.setText("TabB页面");
        if (tabB == null) {
            tabB = new TabB();
            transaction.add(R.id.index_content_fl, tabB);
        } else {
            transaction.show(tabB);
        }
    }

    /**
     * 跳转到tabC
     *
     * @param transaction
     */
    private void changeToTabC(FragmentTransaction transaction) {
        indexTitleTv.setText("TabC页面");
        if (tabC == null) {
            tabC = new TabC();
            transaction.add(R.id.index_content_fl, tabC);
        } else {
            transaction.show(tabC);
        }
    }

    /**
     * 跳转到tabD
     *
     * @param transaction
     */
    private void changeToTabD(FragmentTransaction transaction) {
        indexTitleTv.setText("TabD页面");
        if (tabD == null) {
            tabD = new TabD();
            transaction.add(R.id.index_content_fl, tabD);
        } else {
            transaction.show(tabD);
        }
    }


    /**
     * @param transaction 隐藏所有fragment
     */
    private void hideFragments(FragmentTransaction transaction) {

        if (tabA != null && !tabA.isHidden()) {
            transaction.hide(tabA);
        }
        if (tabB != null && !tabB.isHidden()) {
            transaction.hide(tabB);
        }
        if (tabC != null && !tabC.isHidden()) {
            transaction.hide(tabC);
        }
        if (tabD != null && !tabD.isHidden()) {
            transaction.hide(tabD);
        }
    }

}

总结

总体来说还是挺简单的,当然还可以使用其他的方式进行布局,有兴趣的朋友可以研究下。如果想用这种方式的话,你只用把里面的资源文件改成自己使用的资源文件就可以在自己的项目中使用了。当然,我这个命名还不是很规范,大家可以规范下命名。

特此记录!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值