美文网首页
自定义底部导航栏

自定义底部导航栏

作者: Thestarxc | 来源:发表于2020-10-06 19:57 被阅读0次

首先,在做底部导航栏界面之前,先来分析一下界面结构,比如界面的基本布局,用到哪些基础的控件。


界面分析.png

整体是一个纵向的线性布局(紫色框),自上到下放了一个线性布局(红色框)和一个单选按钮组(橙色框)。单选按钮组类似于一个横向的线性布局,从左到右放了四个单选按钮。
分析完后开始写代码,
因为我们的单选按钮是自定义的样式,所以先做下面这些准备。
第一,准备素材资源。
把图片资源放入res/drawable/文件夹下。ctrl+c,选中res/drawable 文件夹ctrl+v
第二,准备样式资源。
把写好的selector_nav_course.xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/ic_course_selected"/>
    <item android:drawable="@mipmap/ic_course"/>
</selector>

selector_nav_excise.xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/ic_exercise_selected"/>
    <item android:drawable="@mipmap/ic_exercise"/>
</selector>

selector_nav_massage.xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/ic_message_selected"/>
    <item android:drawable="@mipmap/ic_message"/>
</selector>

selector_nav_my.xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/ic_my_selected"/>
    <item android:drawable="@mipmap/ic_my"/>
</selector>

selector_nav_text.xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/colorBlue"/>
    <item android:color="@color/colorGray"/>
</selector>

如果你selector_nav_text.xml文件中用到的颜色没有定义,请在res/value/color.xml中定义

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="colorGray">#2F2F2F</color>
    <color name="colorBlue">#1E6D96</color>
</resources>

5个文件放在res/drawable/文件夹下。就像这样


6.png

第三,资源准备完毕,自定义按钮样式。在res/values/style.xml中写入如下代码

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>
<!--    底部菜单按钮的样式-->
    <style name="TabMenuItem">
<!--        将默认的按钮样式设为空,即不使用默认的样式-->
        <item name="android:button">@null</item>
<!--        自定义按钮样式 name后的内容为属性设置样式的名称通过设置<item></item>之间的内容设置自定义的样式的属性值-->
        <item name="android:layout_weight">1</item>
        <item name="android:layout_width">8dp</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@drawable/selector_nav_text</item>
        <item name="android:gravity">center</item>
        <item name="android:paddingTop">3dp</item>
    </style>

</resources>

这种写法是引用了下面的知识点,可以回顾一下


样式.png
主题.png

终于最后一步啦!!!

新建一个名为TabMenu的Activity。 1.png
右键-new-Activity-Empty Activity 2.png

在res/layout/activity_tab_bar.xml中写入如下代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".HomeActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#00ff00"
        android:orientation="vertical"
        >
     <FrameLayout
         android:id="@+id/main_body"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@color/colorBlue">

     </FrameLayout>
    </LinearLayout>
    <RadioGroup
        android:id="@+id/btn_group"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="#F2F2F2"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/btn_course"
            style="@style/TabMenuItem"
            android:drawableTop="@drawable/selector_nav_course"
            android:text="课程"
            />
        <RadioButton
            android:id="@+id/btn_execise"
            style="@style/TabMenuItem"
            android:drawableTop="@drawable/selector_nav_execise"
                android:text="习题"
            />
        <RadioButton
            android:id="@+id/btn_message"
            style="@style/TabMenuItem"
            android:drawableTop="@drawable/selector_nav_message"
            android:text="咨询"
            />
        <RadioButton
            android:id="@+id/btn_my"
            style="@style/TabMenuItem"
            android:drawableTop="@drawable/selector_nav_my"
            android:checked="true"
            android:text="我"
            />
    </RadioGroup>
</LinearLayout>

需要注意的是第一个LinerLayout的orientation属性是纵向的,RadioGroup的orientation属性是横向的。当第二个LinerLayout的高度设为0dp,RadioGroup的高度设为指定高度是可以实现RadioGroup被LinerLayout顶在最下方的效果。
就做好了。

相关文章

网友评论

      本文标题:自定义底部导航栏

      本文链接:https://www.haomeiwen.com/subject/cobtpktx.html