当前位置: 首页 > article >正文

Android Studio使用BottomNavigationView实现底部导航栏demo

Android Studio使用BottomNavigationView实现底部导航栏demo

  • 说明
  • 项目创建
  • 页面代码实现
  • 底部导航栏切换代码实现

说明

安卓小白第一次学习安卓,这里记录下自己学习开发安卓的底部导航栏的过程,用原生安卓实现,使用Java语言进行代码编写,使用BottomNavigationView+Fragment组件来实现底部导航栏切换。

Android Studio官网下载:https://developer.android.google.cn/studio?hl=zh-cn
Android BottomNavigationView组件地址:https://developer.android.google.cn/reference/com/google/android/material/bottomnavigation/BottomNavigationView

项目创建

用Android Studio新建一个项目,操作如下:
在这里插入图片描述
我这里选择的是Empty Views Activity,因为选择这个可以选择Java语言进行开发。
在这里插入图片描述
新建完成后,如下,它会去下载这个依赖,因为这个依赖是国外的,所以下载很慢。
在这里插入图片描述
如果需要使用国内的镜像进行下载,方法如下:

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip

在gradle-wrapper.properties中将下载源改为国内镜像地址。
在这里插入图片描述
在settings.gradle添加如下代码:

maven { url = uri("https://maven.aliyun.com/nexus/content/repositories/google") }
maven { url = uri("https://maven.aliyun.com/nexus/content/groups/public") }
maven { url = uri("https://maven.aliyun.com/nexus/content/repositories/jcenter") }
 maven { url = uri("https://plugins.gradle.org/m2/") }

修改后如下:
在这里插入图片描述
添加完成后,关闭项目然后重新打开。就能发现右下角下载依赖的时候,下载源变为自己设置的国内镜像源了。
在这里插入图片描述

页面代码实现

在app/src/main/res目录下新建drawable-xxhdpi目录,表示里面存放的是高清图片。举个例子,以视频画质作为例子,比如drawable表示480视频画质,drawable-hdpi表示720的高清画质,drawable-xhdpi表示1080的画质,依次类推越往后越清晰。然后随便在网上找几个图标图片,好像只能存放jpg和png图片。不能放svg图片,这里以png图片为例。
在这里插入图片描述
这里放了四个图片
在这里插入图片描述
在app/src/main/res目录下新建menu目录,用来存放底部导航栏的菜单项。
在这里插入图片描述
在这个目录下面新建一个xml,名字为bottom_bar_menu.xml,操作如下:
在这里插入图片描述
选择中间这个,左边用来写代码,右边查看布局。
在这里插入图片描述
bottom_bar_menu.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/menu_message"
        android:icon="@drawable/home"
        android:title="微信"/>

    <item
        android:id="@+id/menu_address_book"
        android:icon="@drawable/analysis"
        android:title="通讯录"/>

    <item
        android:id="@+id/menu_discovery"
        android:icon="@drawable/report"
        android:title="发现"/>

    <item
        android:id="@+id/menu_me"
        android:icon="@drawable/performance"
        android:title="我的"/>
</menu>

效果如下:
在这里插入图片描述
在app/src/main/res/values增加一个灰色。
在这里插入图片描述
在app/src/main/res目录下新建color目录,文件名为color_bottom_bar.xml,用来存放底部导航栏切换时选中的颜色和未选中的颜色。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!--底部导航栏选中时为绿色,未选中时为灰色-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#1aad19" android:state_selected="true"/>
    <item android:color="#333333" android:state_selected="false"/>
</selector>

在这里插入图片描述
修改app/src/main/res/layout下的activity_main.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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--显示底部导航栏对应内容-->
    <FrameLayout
        android:id="@+id/container"
        android:background="@color/white"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <!--底部导航栏控件-->
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        app:menu="@menu/bottom_bar_menu"
        app:labelVisibilityMode="labeled"
        app:itemActiveIndicatorStyle="@null"
        app:itemBackground="@color/grey"
        app:itemTextColor="@color/color_bottom_bar"
        app:itemIconTint="@color/color_bottom_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

效果图如下:
在这里插入图片描述
然后删除掉MainActivity中的这部分代码,因为在activity_main.xml删除掉了id为main这个属性,为了防止启动报错,所以这里删除掉。
在这里插入图片描述
这里我是用的雷电模拟器看的页面效果,效果如下:
在这里插入图片描述

底部导航栏切换代码实现

在app/src/main/java/com.example.bottom_navigation_demo下新建一个fragment目录。在该目录下新建一个Fragment的HomeFragment文件,表示的是微信的首页。如下:
在这里插入图片描述
在这里插入图片描述
在HomeFragment文件中删除掉冗余代码,修改后如下:
在这里插入图片描述
然后再重复三次操作,新建其他三个页面的Fragment。如下:
layout下的fragment_home.xml表示微信的页面布局。
layout下的fragment_address_book.xml表示通信录的页面布局。
layout下的fragment_discovery.xml表示发现的页面布局。
layout下的fragment_me.xml表示我的页面布局。
HomeFragment类表示的是fragment_home.xml的交互逻辑。
AddressBookFragment类表示的是fragment_address_book.xml的交互逻辑。
DiscoveryFragment类表示的是fragment_discovery.xml的交互逻辑。
MeFragment类表示的是fragment_me.xml的交互逻辑。
在这里插入图片描述
然后修改layout下的fragment_home.xml里面的代码,修改完后代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".fragment.HomeFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:layout_centerInParent="true"
        android:text="首页" />

</RelativeLayout>

效果如下:
在这里插入图片描述
其他三个依次坐重复的修改,只是要将android:text="首页"改为对应的页面字段。

点击底部导航栏时,切换到对应的页面,MainActivity代码如下:

package com.example.bottom_navigation_demo;

import android.os.Bundle;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import com.example.bottom_navigation_demo.fragment.AddressBookFragment;
import com.example.bottom_navigation_demo.fragment.DiscoveryFragment;
import com.example.bottom_navigation_demo.fragment.HomeFragment;
import com.example.bottom_navigation_demo.fragment.MeFragment;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    //定义Fragment列表用于切换
    List<Fragment> fragmentList;
    //定义底部导航栏用于切换
    BottomNavigationView bottomNavigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化fragmentList
        fragmentList=new ArrayList<>();
        fragmentList.add(new HomeFragment());
        fragmentList.add(new AddressBookFragment());
        fragmentList.add(new DiscoveryFragment());
        fragmentList.add(new MeFragment());
        //默认显示第一个首页fragment
        showFragment(fragmentList.get(0));
        //找到底部导航栏id
        bottomNavigationView=findViewById(R.id.bottom_navigation);
        //底部导航栏点击时触发
        bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            	//用switch报错,改用if实现
                if(item.getItemId()==R.id.menu_message){
                    showFragment(fragmentList.get(0));//显示微信
                }else if(item.getItemId()==R.id.menu_address_book){
                    showFragment(fragmentList.get(1));//显示通讯录
                }else if(item.getItemId()==R.id.menu_discovery){
                    showFragment(fragmentList.get(2));//显示发现
                }else {
                    showFragment(fragmentList.get(3));//显示我的
                }
                return true;
            }
        });
    }

    //显示fragment
    public void showFragment(Fragment fragment){
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        // 替换Fragment
        fragmentTransaction.replace(R.id.container,fragment);
        // 提交事务
        fragmentTransaction.commit();
    }
}

用雷电模拟器展示的效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里示例代码就写完了,点击底部导航栏时,里面的内容也发生了对应的变化,达到了想要的效果,如果要写具体的页面和交互,比如我的要写一个页面内容,就去fragment_me.xml去写具体的页面布局,然后再去MeFragment类实现对应的事件类进行交互即可。


http://www.kler.cn/a/456204.html

相关文章:

  • 【Python】用Python构建高效的应用程序健康检查与监控系统
  • 浅谈某平台多场景下反爬虫与风控业务
  • jetson 无显示器配置WIFI
  • 音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件
  • 线性直流电流
  • 【ES6复习笔记】Map(14)
  • 【Ext.js 初步入门】Ext.js 作用以及用法 概述
  • 企业内训|AI大模型在汽车行业的前沿应用研修-某汽车集团
  • Java MySQL 连接
  • 自动化测试- 自动化测试模型
  • RabbitMQ - 1 ( 7000 字 RabbitMQ 入门级教程 )
  • PyTorch框架实现的简单手写数字识别模型,使用MNIST数据集进行训练和测试
  • 32单片机从入门到精通之硬件架构——总线系统(二)
  • word中文献引用[]符号的上下标格式修改
  • 【反转链表系列】力扣206,92,25
  • WINDOWS对话框模板结构简析
  • 接口自动化测试平台项目环境搭建
  • 如何使用Porcupine做一个安卓端语音唤醒demo
  • java相关学习文档或网站整理
  • 【MySQL】数据库初始化报错
  • Mono里运行C#脚本7—MonoImageStorage结构解析
  • 【Sentinel】初识Sentinel
  • 【小程序】全局配置window和tabBar
  • 在 Windows 11 下的 WSL - Ubuntu 24.04 中安装 Anaconda3
  • jmeter混合场景测试,设置多业务并发比例(吞吐量控制器)
  • 【AI日记】24.12.28 kaggle 比赛 2-16