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

Android Studio新手开发第二十八天

目录

利用BottomNavigationView实现底部标签栏

利用BottomNavigationView实现底部标签栏

        Android Studio可以直接生成带有底部标签栏的页面。右键依次选择New、Activity、选择Bottom Navigation Activity。运行APP可以看到如下界面,页面下方有三个导航标签,分别为Home、Dashboard、Notifications。Home频道的图片与文字与其他不同,这代表着当前频道为Home,点击其他频道可以切换到对应的频道上。此时虽然实现了简单的底部标签栏,但要修改一些属性时仍需了解它的实现方式,如修改标签栏的文本与图片、添加其他视图等。

        首先打开模块的build.gradle,在dependencies节点内可以看到如下依赖库配置,表示引用了标签导航的navigation库。

    implementation 'androidx.navigation:navigation-fragment:2.3.5'implementation 'androidx.navigation:navigation-ui:2.3.5'

        再看看页面的布局文件中的代码,可以看到页面分为两个部分,一个是位于底部的BottomNavigationView,一个是位于标签栏上占据其余空间的碎片Fragment。标签栏中的属性app:menu用于设置标签栏中的菜单即底部标签栏。碎片中的属性app:navGraph用于设置各频道的主体部分。

<com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/nav_view"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginStart="0dp"android:layout_marginEnd="0dp"android:background="?android:attr/windowBackground"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:menu="@menu/bottom_nav_menu" /><fragmentandroid:id="@+id/nav_host_fragment_activity_bottom_navigation_view"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"app:defaultNavHost="true"app:layout_constraintBottom_toTopOf="@id/nav_view"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:navGraph="@navigation/mobile_navigation" />

        打开属性menu中对应的文件,查看其中的代码,如下所示。可以看到标签栏中图片以及文本的定义在这里,可以在这里修改标签栏的图片以及文本内容

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/navigation_home"android:icon="@drawable/ic_home_black_24dp"android:title="@string/title_home" /><itemandroid:id="@+id/navigation_dashboard"android:icon="@drawable/ic_dashboard_black_24dp"android:title="@string/title_dashboard" /><itemandroid:id="@+id/navigation_notifications"android:icon="@drawable/ic_notifications_black_24dp"android:title="@string/title_notifications" /></menu>

        打开属性navGraph中对应的文件,查看其中的代码,如下所示。可以看到各个频道对应的碎片定义在这里,其中根节点的属性startDestination用于设置打开页面时显示的第一个频道。每个碎片都设置了四个属性id、name、label、layout,分别用于设置碎片id、设置碎片完整路径。设置碎片的标题文本即显示在碎片上方的文本、设置碎片的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/mobile_navigation"app:startDestination="@+id/navigation_home"><fragmentandroid:id="@+id/navigation_home"android:name="com.example.myapplicationforstudy.BottomNavigation.ui.home.HomeFragment"android:label="@string/title_home"tools:layout="@layout/fragment_home" /><fragmentandroid:id="@+id/navigation_dashboard"android:name="com.example.myapplicationforstudy.BottomNavigation.ui.dashboard.DashboardFragment"android:label="@string/title_dashboard"tools:layout="@layout/fragment_dashboard" /><fragmentandroid:id="@+id/navigation_notifications"android:name="com.example.myapplicationforstudy.BottomNavigation.ui.notifications.NotificationsFragment"android:label="@string/title_notifications"tools:layout="@layout/fragment_notifications" />
</navigation>

        打开其中一个碎片如HomeFragment,查看其中的代码,如下所示。在碎片的方法onCreateView中根据布局文件生成页面元素,因此可以在碎片中修改页面元素。HomeViewModle类随页面建立时生成,与碎片类所在位置一致。

    private FragmentHomeBinding binding;public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {//管理 UI 相关数据,在配置变更(如旋转)时保持数据,该类随页面建立时生成,与碎片类所在位置一致HomeViewModel homeViewModel =new ViewModelProvider(this).get(HomeViewModel.class);//将 XML 布局文件转换为绑定对象binding = FragmentHomeBinding.inflate(inflater, container, false);// 获取布局的根视图View root = binding.getRoot();//通过视图绑定直接访问布局中的 TextView,等价于 findViewById(R.id.text_home),但更安全、类型安全final TextView textView = binding.textHome;//从HomeViewModel中获取一个LiveData<String>(或类似的可观察数据)并开始观察它。//getViewLifecycleOwner()返回与Fragment视图生命周期关联的LifecycleOwner,这确保了观察只会在Fragment视图存在时进行。//当LiveData中的数据变化时,会调用textView.setText方法,更新TextView的文本。homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);return root;}

        查看HomeViewModle类的代码,如下所示。它的构造方法中设置了mText的文本。

public class HomeViewModel extends ViewModel {private final MutableLiveData<String> mText;public HomeViewModel() {mText = new MutableLiveData<>();mText.setValue("This is home fragment");}public LiveData<String> getText() {return mText;}
}

        接下来将原本的英文修改为中文,找到对应位置修改文本,修改后效果图如下。

http://www.dtcms.com/a/515583.html

相关文章:

  • 系统与网络安全------弹性交换网络(4)
  • 功能网站首页模板微信小说分销平台
  • 网站建设管理规定php网站怎么建设
  • 【软考备考】物联网架构:感知层、网络层、平台层、应用层详解
  • LeetCode每日一题——二进制求和
  • 【LeetCode】长度最小的子数组
  • 从什么网站建网站好百度seo优化哪家好
  • 深度学习——基于 PyTorch 的蔬菜图像分类
  • 【设计模式】适配器模式(Adapter)
  • docker安装中间件
  • 系统架构设计师备考第48天——机器人边缘计算
  • 门头沟高端网站建设阿里云服务器win系统建站教程
  • ui设计培训机构哪个比较好cpu优化软件
  • 计算机运算中的上溢、下溢是什么?
  • 别再滥用 new/delete
  • 自己做网站的视频做网站不实名认证可以吗
  • Vertical Semiconductor融资1100万美元
  • 坐标系旋转(四元数 + 欧拉角 + 轴角表示 +旋转矩阵)
  • 发刊词:开启你的高效决策之旅(专栏目录)
  • D触发器学习
  • 汶上云速网站建设wordpress多域名支持
  • C++(23):contains检查字符串是否包含子字符串
  • 23.UE-游戏逆向-寻找骨骼坐标
  • Python 图片转 PDF 详解:单张、多张及多图片格式转换
  • 深圳展示型网站建设佛山seo优化代理
  • AI研究-110 DeepSeek-OCR 原理剖析|上下文光学压缩、Gundam 动态分辨率与并发预期 附代码
  • Easyx图形库应用(mcu+lua vs plc+st)
  • 【计算机网络笔记】第一章 计算机网络导论
  • AI搜索驱动的品牌传播变革:品牌如何在“被搜索”转向“被理解”的浪潮中重构增长力
  • 秦皇岛网站建设哪家好医疗软件公司排名