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

embedded/2024/12/29 7:40:22/

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语言进行开发。
在这里插入图片描述
新建完成后,如下,它会去下载这个依赖,因为这个依赖是国外的,所以下载很慢。
在这里插入图片描述
如果需要使用国内的镜像进行下载,方法如下:

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

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

java">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"><itemandroid:id="@+id/menu_message"android:icon="@drawable/home"android:title="微信"/><itemandroid:id="@+id/menu_address_book"android:icon="@drawable/analysis"android:title="通讯录"/><itemandroid:id="@+id/menu_discovery"android:icon="@drawable/report"android:title="发现"/><itemandroid: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"><!--显示底部导航栏对应内容--><FrameLayoutandroid: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.BottomNavigationViewandroid: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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="30sp"android:layout_centerInParent="true"android:text="首页" /></RelativeLayout>

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

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

java">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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化fragmentListfragmentList=new ArrayList<>();fragmentList.add(new HomeFragment());fragmentList.add(new AddressBookFragment());fragmentList.add(new DiscoveryFragment());fragmentList.add(new MeFragment());//默认显示第一个首页fragmentshowFragment(fragmentList.get(0));//找到底部导航栏idbottomNavigationView=findViewById(R.id.bottom_navigation);//底部导航栏点击时触发bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {@Overridepublic 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;}});}//显示fragmentpublic void showFragment(Fragment fragment){FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();// 替换FragmentfragmentTransaction.replace(R.id.container,fragment);// 提交事务fragmentTransaction.commit();}
}

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


http://www.ppmy.cn/embedded/149675.html

相关文章

实验室服务器Ubuntu安装使用全流程

一、制作U盘启动盘 工具&#xff1a; 一个32G以上的U盘Rufuse镜像烧录软件下载&#xff1a;https://cn.ultraiso.net/xiazai.htmlRufus - 轻松创建 USB 启动盘https://cn.ultraiso.net/xiazai.htmlUbuntu系统镜像&#xff1a;https://ubuntu.com/download/alternative-downlo…

NLP 中文拼写检测纠正论文 A Hybrid Approach to Automatic Corpus Generation 代码实现

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

【每日学点鸿蒙知识】userAgent识别问题、StatusBar颜色、taskpool中操作同一个对象、scroll组件

1、HarmonyOS window.navigator.userAgent.toLowerCase()方法获取的值都有哪些&#xff1f; h5暂无法通过window.navigator.userAgent识别&#xff0c;只能通过原生注入固定字段识别&#xff0c; 可以参考这篇文档&#xff1a;https://developer.huawei.com/consumer/cn/forum…

Linux RTC 驱动框架

目录 一、实时时钟&#xff08;RTC&#xff09;介绍1.1 概述1.2 功能1.3 应用场景1.4 工作原理1.5 对外接口1.6 常见 RTC 芯片1.7 在 Linux 系统中的应用1.8 注意事项 二、Linux 内核 RTC 驱动框架2.1 相关源码文件介绍2.2 核心数据结构2.2.1 struct rtc_device2.2.2 rtc_class…

JS中for循环里的ajax请求不数据

问题&#xff1a;在for循环里调接口&#xff0c;调接口的请求方式用ajax的写法&#xff0c;发现每次循环都会跳过ajax&#xff0c;导致获取不到接口数据 问题解决&#xff1a;for循环是单线程的&#xff0c;是同步的。ajax是异步的。把ajax变成同步的就可以了: …

CBSD管理QEMU仿真虚拟机

CBSD管理QEMU仿真虚拟机 first QEMU VM 使用 cbsd qconstruct-tui创建 cbsd qconstruct-tuino such qemu-system-x86_64, please install qemu and re-run: cbsd initenv Please follow https://www.bsdstore.ru/en/cbsd_qemu_quickstart.html instruction to setup FreeBSD …

jmeter混合场景测试,设置多业务并发比例(吞吐量控制器)

jmeter混合场景测试&#xff0c;设置多业务并发比例&#xff08;吞吐量控制器&#xff09; 测试目的 为了验证需求提出的性能要求&#xff0c;结合实际可能的高压力场景&#xff0c;较全面的检测系统的性能表现。 测试方法 根据需求调研的业务模型和交易占比&#xff0c;设置不…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…