目标:

要实现的界面如下:

此时,我们需要采用BottomNavigationView+ViewPager+Fragment,一点点的说起。首先要在app/build.gradle里添加:

implementation 'com.google.android.material:material:1.1.0'

底部导航栏

因为现在基本上都要往androidx版本转了。然后,在main.xml里面添加如下:

    <com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/bottom_nav_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"app:menu="@menu/tab_menu"app:itemBackground="@color/dividerColor"app:labelVisibilityMode="labeled"/>

app:menu会把新建的menu菜单item自动装入此navigation。tab_menu菜单如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/tab_chat"android:icon="@mipmap/tab_chat_normal"android:title="@string/tab_chat" /><itemandroid:id="@+id/tab_contacts"android:icon="@mipmap/tab_contacts_normal"android:title="@string/tab_contact" /><itemandroid:id="@+id/tab_find"android:icon="@mipmap/tab_chat_normal"android:title="@string/tab_find" /><itemandroid:id="@+id/tab_me"android:icon="@mipmap/tab_me_normal"android:title="@string/tab_me" />
</menu>

至于背景颜色、图片icon、string字符串,自己添加就行了。这里需要注意有时候,BottomNavigationView里面添加的item大于3个,会出现“未铺满”的假象,实际上就是加载多了,需要在xml里面加入(具体的mode选项请自行百度,这里只提供思路):

app:labelVisibilityMode="labeled"

中间页面:

直接看xml结构还清晰点。

那么viewPager容器放好了,还要新建四个对应的fragment放里面,这样才能根据导航栏切换。

public class ChatFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_chat, container, false);}
}

起演示效果,这里每个fragment只加载xml文件:

<LinearLayoutxmlns: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.ChatFragment"><!-- TODO: Update blank fragment layout --><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="@string/hello_chat_fragment" /></LinearLayout>

每个xml文件也只有一个textView显示内容作为区别。

此时,需要新建一个adpter适配器,这种情况在Android开发里很多,适配器模式目的就是为了把一个目标适配成另外一个目标。

public class MainFragmentAdapter extends FragmentPagerAdapter {private List<Fragment> mFragmentList;public MainFragmentAdapter(@NonNull FragmentManager fm, List<Fragment> fragments) {super(fm);this.mFragmentList = fragments;}@NonNull@Overridepublic Fragment getItem(int position) {return mFragmentList.get(position);}@Overridepublic int getCount() {return mFragmentList.size();}
}

这里,SDK同样为我们准备了两个adpter,fragmentPagerAdapter和FragmentPagerStateAdapter,这两个的区别就是:pageStateAdapter每次滑动过后会将前一个或者后一个fragment销毁,即destroyView和OnDetach等得到执行,目的就是为了释放资源。因此,当加入viewpager的fragment过多时,考虑用后一种adpter,当然,一般不会有人超过四个。

回到MainActivity里面:

 private void  initMainData(){mMainFragmentList = new ArrayList<>(4);mMainFragmentList.add(new ChatFragment());mMainFragmentList.add(new ContactFragment());mMainFragmentList.add(new FindFragment());mMainFragmentList.add(new MeFragment());//viewpager初始化MainFragmentAdapter mainFragmentAdapter = new MainFragmentAdapter(getSupportFragmentManager(), mMainFragmentList);mViewPager.setAdapter(mainFragmentAdapter);//viewpager滑动点击等监听mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {int menuId = item.getItemId();// 跳转指定页面:Fragmentswitch (menuId) {case R.id.tab_chat:mViewPager.setCurrentItem(0);break;case R.id.tab_contacts:mViewPager.setCurrentItem(1);break;case R.id.tab_find:mViewPager.setCurrentItem(2);break;case R.id.tab_me:mViewPager.setCurrentItem(3);break;}return false;}});mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {//滑动到某页面让底部导航栏为选中状态mBottomNavigationView.getMenu().getItem(position).setChecked(true);}@Overridepublic void onPageScrollStateChanged(int state) {}});}

首先新建一个ArrayList把要滑动的fragment装进去,再适配,添加listerner。即可。放一个完整的图:


此专栏上一篇文章:Material Design之ActionBar、ToolBar

github代码:我的github

BottomNavigationView+ViewPager+Fragment仿微信底部导航栏相关推荐

  1. 3分钟教你实现仿微信底部导航栏效果(BottomNavigationView + ViewPager)

    文章目录 实现效果图 前言 XML布局 menu文件 ViewPager的使用 PagerAdapter(Java) Activity中实现 上下联动 侧滑带动按钮选择 点击底部按钮带动页面 自定义选 ...

  2. android 微信底部渐变,仿微信底部导航栏BottomNavigation渐变色

    ezgif.com-video-to-gif.gif 不说废话了,直接上代码: 自定义View /** * * author : Harvey * time : 2018/06/14 * desc : ...

  3. JFTabBar android强大的底部导航栏框架 (微信底部导航栏效果)

    TabBar这个名字相信很多学过一点IOS程序员都知道它是用来干嘛的,但本人也并非擅长开发IOS程序员,只是略懂略懂....这是一个很强大的TabBar,可满足很多需求.用起来也非常简单,在oncre ...

  4. android radiobutton底部导航,android中Fragment+RadioButton实现底部导航栏

    在App中经常看到这样的tab底部导航栏 那么这种效果是如何实现,实现的方式有很多种,最常见的就是使用Fragment+RadioButton去实现.下面我们来写一个例子 首先我们先在activity ...

  5. 微信底部导航栏动画实现

    微信底部导航栏动画实现 Android大神郭霖的公众号中关于微信底部动画实现的更新 Android大神郭霖的公众号中关于微信底部动画实现的更新 郭霖老师的代码里还是support库,我更新成了Andr ...

  6. android仿咸鱼底部导航栏,Flutter沉浸式状态栏/AppBar导航栏/仿咸鱼底部凸起导航栏效果...

    如下图:状态栏是指android手机顶部显示手机状态信息的位置. android 自4.4开始新加入透明状态栏功能,状态栏可以自定义颜色背景,使titlebar能够和状态栏融为一体,增加沉浸感. 如上 ...

  7. Android仿Qzone底部导航栏加号弹出菜单

    最近看到QQ空间 新浪微博-.好多应用底部导航栏都有加号点击弹出菜单,于是就写了一个demo,来给没做过这个功能的小伙伴一个参考,希望对大家有所帮助,demo中的图片均来源于Qzone 仅作为学习交流 ...

  8. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新

    现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...

  9. 使用ViewPager + Fragment实现微信底部Tab效果

    下面是最常用的Tab布局,最终实现效果 MainActivity的主文件代码: public class MainActivity extends FragmentActivity implement ...

最新文章

  1. 判断字符串NSString是否是整形或者浮点型
  2. 记一次曲折的后台getshell过程
  3. 欢迎来到 C# 9.0(Welcome to C# 9.0)
  4. 【elasticsearch】ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]
  5. linux安半程序自动确认,利用system-config-kickstart实现半自动化安装
  6. Java 读写txt文件
  7. 学习笔记—bootstrap(2)
  8. fastDFS图片服务器的一些常见错误
  9. C语言 查找书籍(结构体)
  10. 第二章 03 藤蔓生长
  11. 带宽和网速之间的关系
  12. 菜菜的刷题日记 | 66.加一 Plus One
  13. 手机扫描计数器有哪些?实用扫描计数软件分享给你
  14. 如果用seagull php框架开发一个类似zen cart,Oscommerce,magento这样的模块会什么样
  15. 开源者的自我修养|为 ShardingSphere 贡献了千万行代码的程序员,后来当了 CEO
  16. 跌跌撞撞尝试Scrapy+Selenium+MySQL爬取与存储东方财富网股票数据
  17. 五款双11抢疯了的高性能蓝牙耳机,我手里的AIrPods真的不香了~
  18. maven打瘦包,且只打入部分想打入的依赖瘦包
  19. postgreSQL与postGIS安装过程中遇到的坑及解决
  20. 《Python从小白到大牛》第3章 第一个Python程序

热门文章

  1. VMware卸载虚拟机
  2. 阿里云API网关相关操作
  3. 模板匹配—归一化相关系数匹配算法
  4. 深入浅出Rust-Future-Part-5.md
  5. 3星|《掌控大趋势》:全球当前政治经济形式的资料汇编整理,对未来的预测很少,也缺乏独到深刻的见解...
  6. Eclipse-Java代码规范和质量检查插件-阿里编码规约
  7. 201621123028《Java程序设计》第一周学习总结
  8. 勒索软件可能已被“终极”解决
  9. Tech UP——EGO北京分会成立啦
  10. MVC3----筛选数据(BeginForm:输出form表单)