方式1:使用BottomNavigationView控件

xml代码:

<!--底部导航栏--><com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/main_navigation_bar"android:layout_width="match_parent"android:layout_height="49dp"android:layout_alignParentBottom="true"app:itemIconTint="@drawable/navigation_bar_bg"app:itemTextColor="@drawable/navigation_bar_bg"android:background="@color/white"app:menu="@menu/my_navigation_items"/>

需要在menu菜单中配置每个item

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/home"android:icon="@mipmap/home_normal"android:title="@string/text_home" /><itemandroid:id="@+id/selected"android:icon="@mipmap/select_normal"android:title="@string/text_selected" /><itemandroid:id="@+id/red_packet"android:icon="@mipmap/red_packet_normal"android:title="@string/text_packet" /><itemandroid:id="@+id/search"android:icon="@mipmap/search_normal"android:title="@string/text_search" />
</menu>

java代码中获取对应的id即可处理点击事件:

private void initListener() {mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item) {int itemId = item.getItemId();switch (itemId) {case R.id.home:switchFragment(mHomePageFragment);Logit.d(TAG, " cfx " + item.getTitle());break;case R.id.selected:switchFragment(mSelectedPageFragment);Logit.d(TAG, " cfx " + item.getTitle());break;case R.id.red_packet:switchFragment(mRedPacketPageFragment);Logit.d(TAG, " cfx " + item.getTitle());break;case R.id.search:switchFragment(mSearchPageFragment);Logit.d(TAG, " cfx " + item.getTitle());break;}return true;}});}

方式2:通过自定义RadioGroup实现

xml布局

<!--RadioGroup继承子LinearLayout,需要设置orientation--><RadioGroupandroid:id="@+id/test_navigation_bar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:orientation="horizontal"><!--android:background="@null" 没有了默认点击的阴影效果--><!--android:button="@null" 取消RadioButton前面的选择框--><RadioButtonandroid:id="@+id/test_home"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:button="@null"android:drawableTop="@drawable/test_home_selector"android:gravity="center"android:text="@string/text_home"android:textColor="@drawable/navigation_bar_bg"android:textSize="18sp" /><RadioButtonandroid:id="@+id/test_selected"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@null"android:drawableTop="@drawable/test_selected_selector"android:gravity="center"android:text="@string/text_selected"android:textColor="@drawable/navigation_bar_bg"android:textSize="18sp" /><RadioButtonandroid:id="@+id/test_red_packet"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@null"android:drawableTop="@drawable/test_packet_selector"android:gravity="center"android:text="@string/text_packet"android:textColor="@drawable/navigation_bar_bg"android:textSize="18sp" /><RadioButtonandroid:id="@+id/test_search"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@null"android:drawableTop="@drawable/test_search_selector"android:gravity="center"android:text="@string/text_search"android:textColor="@drawable/navigation_bar_bg"android:textSize="18sp" /></RadioGroup><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:layout_above="@+id/test_navigation_bar"android:layout_marginBottom="20dp"android:background="@color/colorGrey" />

java代码找到相应的控件:

public class TextNavigationBarActivity extends AppCompatActivity {@BindView(R.id.test_toast)public Button mTestToast;@BindView(R.id.test_navigation_bar)public RadioGroup mNavigationBar;private HomePageFragment mHomePageFragment;private SelectedPageFragment mSelectedPageFragment;private RedPacketPageFragment mRedPacketPageFragment;private SearchPageFragment mSearchPageFragment;private FragmentManager mFragmentManager;@Overrideprotected void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_text_navigation_bar);ButterKnife.bind(this);initFragment();initListener();switchFragment(mHomePageFragment);}private void initFragment() {mHomePageFragment = new HomePageFragment();mSelectedPageFragment = new SelectedPageFragment();mRedPacketPageFragment = new RedPacketPageFragment();mSearchPageFragment = new SearchPageFragment();mFragmentManager = getSupportFragmentManager();}private void switchFragment(BaseFragment baseFragment) {FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();fragmentTransaction.replace(R.id.test_page_container, baseFragment);fragmentTransaction.commit();}private void initListener() {mTestToast.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 多次点击会造成toast错乱,显示不准确// Toast.makeText(TextNavigationBarActivity.this, "dsad", Toast.LENGTH_SHORT).show();// 使用Toast工具类ToastUtils.showToast("测试Toast");}});mNavigationBar.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {switch (i) {case R.id.test_home:switchFragment(mHomePageFragment);break;case R.id.test_selected:switchFragment(mSelectedPageFragment);break;case R.id.test_red_packet:switchFragment(mRedPacketPageFragment);break;case R.id.test_search:switchFragment(mSearchPageFragment);break;}}});}
}

实现NavigationBar的两种方式相关推荐

  1. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  2. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                      优点:输入一行代码立刻返回结果                       缺点:无法永久保存代码 方法 ...

  3. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  4. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  5. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  6. VS Code - Debugger for Chrome调试JavaScript的两种方式

    VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...

  7. 简单介绍python连接telnet和ssh的两种方式

    本文主要介绍了python连接telnet和ssh的两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Telnet 连接方式 #!/usr/bin/env p ...

  8. 简单介绍MySQL开启事务的两种方式

    本篇文章给大家分享MySQL 是如何开启一个事务的,原文通过两种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 方式 1 START TRANSACTION 或 ...

  9. 两种方式(goto语句以及while循环)实现C语言关机小程序

    用C语言写的关机小程序简单易懂,可以拿去整蛊室友同学(每天一个挨打小技巧),下面我就给出两种方式实现这个代码,欢迎大家讨论补充. 1.用goto语句实现: #include <stdio.h&g ...

最新文章

  1. maven2创建或者导入eclipse工程 设置M2_REPO消除错误
  2. double小数点后最多几位_花了这么多冤枉钱后,我最喜欢这4款医美氨基酸洗面奶...
  3. 监控操作系统和服务器,LoadRunner如何监控不同操作系统的服务器?
  4. Golang 垃圾回收剖析
  5. nm命令中符号类型详解
  6. 编译原理—小型(简化)高级语言分析器前端(Java)
  7. vector 查找结构体对象_面试大厂回来,我狠补了一把算法和数据结构
  8. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树
  9. LeetCode 744. Find Smallest Letter Greater Than Target
  10. python 使用异常代替返回状态码
  11. Structure of a Google Docs document 谷歌文档的结构
  12. 【Scratch画图100例】图39-scratch实心圆 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
  13. MATLAB中的偏最小二乘回归(PLSR)和主成分回归(PCR)
  14. 关于el-dialog弹出层右上角叉号绑定取消按钮功能
  15. 跨域图片资源权限(CORS enabled image)
  16. Android开发之svn命令行以及cornerston教程
  17. 新电脑(UEFI+GPT)下安装Ubuntu16.04
  18. html圣杯布局,css圣杯布局和双飞翼布局
  19. Allegro172版本DFM规则之DFA outline
  20. 生产用计算机房噪音应小于,小知识:机房环境基本要求

热门文章

  1. win7总是显示加载计算机,win7电脑开机一直卡正在加载个人设置怎么办
  2. “任性”华为 | 七十八岁老人的“四渡赤水”(二)
  3. 为什么我们要使用std::alloctor
  4. 利用移位和加减法实现乘法运算
  5. 阿布在漏洞复现---心脏滴血(CVE-2014-0160)
  6. Setup.msi和Setup.exe有什么不同
  7. 解决msi文件丢失问题
  8. GoLang之go build命令
  9. Springer的Latex投稿错误记录
  10. DLMS电能表通讯协仪