原文出处

标题:Android底部导航栏,三种风格和实现

作者:阿飞__

原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏

一、效果图展示

如果动图没有动的话,也可以看下面这个静态图

以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发。

二、BottomNavigationView

这是 Google 给我们提供的一个专门用于底部导航的 View,你只需要在新建 Activity 的时候选择 “Bottom Navigation Activity”,IDE 就会自动使用 BottomNavigationView 帮你生成好相应的代码了。

1.在 xml 中使用

    <android.support.design.widget.BottomNavigationViewandroid:id="@+id/navigation"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginEnd="0dp"android:layout_marginStart="0dp"android:background="?android:attr/windowBackground"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:menu="@menu/navigation" />

这里面唯一要注意的就是 app:menu 属性了,它指定了你的导航栏显示的页面菜单是怎样的。

2. 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>

3. 在 Activity 中调用

    private TextView mTextMessage;private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener= new BottomNavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.navigation_home:mTextMessage.setText(R.string.title_home);return true;case R.id.navigation_dashboard:mTextMessage.setText(R.string.title_dashboard);return true;case R.id.navigation_notifications:mTextMessage.setText(R.string.title_notifications);return true;}return false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_style1);mTextMessage = findViewById(R.id.message);BottomNavigationView navigation = findViewById(R.id.navigation);navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);}

这里的演示 code 都是 IDE 自动生成的,由于 BottomNavigationView 目前我还没有在项目中实际使用过,这里不做过多分析,使用起来不难,以上代码已经足以满足我们的基本使用要求了。

三、RadioGroup + ViewPager

这是一种比较常见了的,下面 4 个 tab 的导航按钮,可以切换不同的页面,这里页面使用了 ViewPager + Fragment 的组合,实现了滑动的页面效果,也可以不使用 ViewPager,这个根据产品的定义来使用即可。

1. 布局文件

<?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=".style2.Style2Activity"><android.support.v4.view.ViewPagerandroid:id="@+id/fragment_vp"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/tabs_rg" /><RadioGroupandroid:id="@+id/tabs_rg"android:layout_width="match_parent"android:layout_height="56dp"android:layout_alignParentBottom="true"android:background="#dcdcdc"android:orientation="horizontal"><RadioButtonandroid:id="@+id/today_tab"style="@style/Custom.TabRadioButton"android:checked="true"android:drawableTop="@drawable/tab_sign_selector"android:text="今日" /><RadioButtonandroid:id="@+id/record_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_record_selector"android:text="记录" /><RadioButtonandroid:id="@+id/contact_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_contact_selector"android:text="通讯录" /><RadioButtonandroid:id="@+id/settings_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_setting_selector"android:text="设置" /></RadioGroup>
</RelativeLayout>

2. Activity 类

public class Style2Activity extends AppCompatActivity {private ViewPager mViewPager;private RadioGroup mTabRadioGroup;private List<Fragment> mFragments;private FragmentPagerAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_style2);initView();}private void initView() {// find viewmViewPager = findViewById(R.id.fragment_vp);mTabRadioGroup = findViewById(R.id.tabs_rg);// init fragmentmFragments = new ArrayList<>(4);mFragments.add(BlankFragment.newInstance("今日"));mFragments.add(BlankFragment.newInstance("记录"));mFragments.add(BlankFragment.newInstance("通讯录"));mFragments.add(BlankFragment.newInstance("设置"));// init view pagermAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), mFragments);mViewPager.setAdapter(mAdapter);// register listenermViewPager.addOnPageChangeListener(mPageChangeListener);mTabRadioGroup.setOnCheckedChangeListener(mOnCheckedChangeListener);}@Overrideprotected void onDestroy() {super.onDestroy();mViewPager.removeOnPageChangeListener(mPageChangeListener);}private ViewPager.OnPageChangeListener mPageChangeListener = new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {RadioButton radioButton = (RadioButton) mTabRadioGroup.getChildAt(position);radioButton.setChecked(true);}@Overridepublic void onPageScrollStateChanged(int state) {}};private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {for (int i = 0; i < group.getChildCount(); i++) {if (group.getChildAt(i).getId() == checkedId) {mViewPager.setCurrentItem(i);return;}}}};private class MyFragmentPagerAdapter extends FragmentPagerAdapter {private List<Fragment> mList;public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {super(fm);this.mList = list;}@Overridepublic Fragment getItem(int position) {return this.mList == null ? null : this.mList.get(position);}@Overridepublic int getCount() {return this.mList == null ? 0 : this.mList.size();}}}

这里唯一注意点的就是两个监听事件,要实现底部导航按钮和页面的联动。

四、带页面跳转功能的底部导航

很多 APP 的底部导航栏中间有一个很大的按钮,点击后通常是打开一个新的页面,这里我们要实现的就是这种底部导航。

依旧是使用 RadioGroup 来做,只不过中间一个 tab 我们先用一个空的 View 来占位,然后在这个 View 的位置放置一个较大的按钮来覆盖住。

1. 布局文件

<?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=".style3.Style3Activity"><FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/tabs_rg" /><RadioGroupandroid:id="@+id/tabs_rg"android:layout_width="match_parent"android:layout_height="56dp"android:layout_alignParentBottom="true"android:background="#dcdcdc"android:orientation="horizontal"><RadioButtonandroid:id="@+id/today_tab"style="@style/Custom.TabRadioButton"android:checked="true"android:drawableTop="@drawable/tab_sign_selector"android:text="今日" /><RadioButtonandroid:id="@+id/record_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_record_selector"android:text="记录" /><View style="@style/Custom.TabRadioButton" /><RadioButtonandroid:id="@+id/contact_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_contact_selector"android:text="通讯录" /><RadioButtonandroid:id="@+id/settings_tab"style="@style/Custom.TabRadioButton"android:drawableTop="@drawable/tab_setting_selector"android:text="设置" /></RadioGroup><ImageViewandroid:id="@+id/sign_iv"android:layout_width="80dp"android:layout_height="80dp"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:background="@android:color/transparent"android:src="@mipmap/sign" />
</RelativeLayout>

2. Activity 类

public class Style3Activity extends AppCompatActivity {private RadioGroup mTabRadioGroup;private SparseArray<Fragment> mFragmentSparseArray;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_style3);initView();}private void initView() {mTabRadioGroup = findViewById(R.id.tabs_rg);mFragmentSparseArray = new SparseArray<>();mFragmentSparseArray.append(R.id.today_tab, BlankFragment.newInstance("今日"));mFragmentSparseArray.append(R.id.record_tab, BlankFragment.newInstance("记录"));mFragmentSparseArray.append(R.id.contact_tab, BlankFragment.newInstance("通讯录"));mFragmentSparseArray.append(R.id.settings_tab, BlankFragment.newInstance("设置"));mTabRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// 具体的fragment切换逻辑可以根据应用调整,例如使用show()/hide()getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,mFragmentSparseArray.get(checkedId)).commit();}});// 默认显示第一个getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,mFragmentSparseArray.get(R.id.today_tab)).commit();findViewById(R.id.sign_iv).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(Style3Activity.this, SignActivity.class));}});}}

注意:

如果这里你也想使用 ViewPager 来展示 Fragment 的话,一定要注意这里的 RadioGroup 中间有一个占位的 View,即两者的监听事件里,实现联动时要考虑多个这个 View 的存在。

代码地址: https://gitee.com/afei_/BottomTabbar

转载:Android底部导航栏,三种风格和实现相关推荐

  1. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  2. Android底部导航栏最常用的两种写法

    先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost  , LinearLayout + ImageView + T ...

  3. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  4. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  5. android 固定底部导航,如何设置android底部导航栏位置固定在android

    请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...

  6. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  7. Android底部导航栏,三种风格和实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  8. android底部导航栏软件,三步搞定android应用底部导航栏

    很多android应用底部都有一个底部导航栏,方便用户在使用过程中随意切换.目前常用的做法有三种:一种是使用自定义tabHost,一种是使用activityGroup,一种是结合FrameLayout ...

  9. Android底部导航栏的四种实现

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信,购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

最新文章

  1. case when then else end
  2. 通过有序数组生成平衡搜索二叉树
  3. Welcome email
  4. Linux图片的灰度化,iOS图像灰度解决方案--架构设计
  5. 【OpenPose-Windows】OpenPose+VS2015+Windows+CUDA8+cuDNN5.1 官方配置教程
  6. Iris recognition papers in the top journals in 2017
  7. 带你读论文丨基于视觉匹配的自适应文本识别
  8. Linux策略路由--原理、配置和应用
  9. Android 系统(137)---android打包解包boot.img,system.img
  10. 你不知道的Event Loop
  11. 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
  12. cc语言取消引用_「初识C语言」编译过程
  13. android仿IOS,滑动隐藏底部ScrollView
  14. Java微信小程序商城源码,Java微信开发框架源码,前后端分离
  15. 【简易设计模式07】适配器模式
  16. 关于GHOST恢复提示找不到GHOSTERR.TXT的文件(转)
  17. ImageOptim 图片压缩工具
  18. python 吃cpu 显卡 内存_浅析 Pycharm 内存、cpu 占用率
  19. 红米ac2100路由器刷入openwrt教程
  20. love2d教程28--血条

热门文章

  1. 计算机桌面不在正中怎么办,电脑屏幕不在中间怎么处理
  2. 阿里系-淘宝接口抓取
  3. 计算机硬盘的文件怎么删除文件,如何清理磁盘多余文件 电脑清除多余的空间及文件的图文步骤...
  4. 【JAVA工具类】金额与汉字大小写的转换 金额转换
  5. 自然数分解:任何一个自然数m的立方均可写成m个连续奇数之和。编程实现:输入一自然数 n,求组成 n3的 n个连续奇数。
  6. win10系统 没有wifi图标 WiFi列表没有显示
  7. 电脑连不上网,WiFi没有显示出来
  8. 安邦金融:99%的人都不知道,原来保险还可以这样配置
  9. win7 32位系统搭建iphone开发环境
  10. 获奖团队访谈录|“AI+无线通信”赛道三等奖团队