BottomNavigationView结合ViewPager搭建流行UI框架

本文详细介绍了Android底部导航栏BottomNavigationView的使用,包括菜单定义、图标和文字颜色设置,以及与ViewPager的联动。同时提到了自定义状态栏和标题栏的方法。
摘要由CSDN通过智能技术生成

android:layout_height=“0dp”

android:layout_weight=“1”/>

<android.support.design.widget.BottomNavigationView

android:id=“@+id/bnv”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:background=“?android:attr/windowBackground”

app:itemIconTint=“@drawable/tab_text_color_selector”

app:itemTextColor=“@drawable/tab_text_color_selector”

app:menu=“@menu/navigation”/>

先说说底部导航栏BottomNaviationView:

app:menu=“@menu/navigation” 这句说明:在我们的res文件夹下面有一个menu文件夹,menu文件夹里面有一个navigation文件,里面是关于我们底部导航栏的信息

我们来看看这个navigation.xml文件

<?xml version="1.0" encoding="utf-8"?>

<item

android:id=“@+id/tab_one”

android:icon=“@drawable/tab_one_selector”

android:title=“@string/tab_one”/>

<item

android:id=“@+id/tab_two”

android:icon=“@drawable/tab_two_selector”

android:title=“@string/tab_two”/>

<item

android:id=“@+id/tab_three”

android:icon=“@drawable/tab_three_selector”

android:title=“@string/tab_three”/>

我们看到里面总共有三个导航按钮,我们以第一个为例做一下简单的说明:

id和title属性很简单,我们看一下icon属性,我们平时的底部导航按钮都是上图下文形式的(大多情况是这样),下面的文字是由我们的title属性指定的,上面的图片则是由我们这里的icon属性所决定的,我们看一看这个很简单的tab_one_selector选择器:

<?xml version="1.0" encoding="utf-8"?>

到这app:menu=“@menu/navigation” 就说完了

下面说一下

app:itemIconTint=“@drawable/tab_text_color_selector”

app:itemTextColor=“@drawable/tab_text_color_selector”

app:itemIconTint是设置底部导航按钮图标颜色的属性

app:itemTextColor是设置底部导航按钮文字颜色的属性

由于大多情况下图标和文件颜色都是相同的(为了统一风格样式),所以它们两个我用的是同一个颜色选择器

说到这BottomNaviationView这个控件就说完了,下面解释一下activity_main.xml文件中的状态栏控件,在布局中写状态栏的原因是因为我们的应用主题是没有ActionBar并且状态栏是透明的,所以状态栏和标题栏需要我们自己来写(也是为了满足用户定义不同样式的状态栏和标题栏的要求)

下面看一下appTheme这一主题:

可以看到AppTheme的父主题是没有ActionBar的,而且我们还设置了它的的windowTranslucentStatus为true,即状态栏透明

这样我们的Activity就完全全屏了,没了状态栏和标题栏,我们就可以自己定义状态栏和标题栏了!

到这里activity_main.xml文件就说完了,下面看一下MainActivity.java中的代码

public class MainActivity extends FragmentActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {

private ViewPager mViewPager;

private BottomNavigationView mBottomNavigationView;

private TextView mTitle;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initData();

initListener();

}

private void initView() {

mTitle = (TextView) findViewById(R.id.title);

mBottomNavigationView = (BottomNavigationView) findViewById(R.id.bnv);

mViewPager = (ViewPager) findViewById(R.id.viewpager);

}

private void initData() {

}

private void initListener() {

mBottomNavigationView.setOnNavigationItemSelectedListener(this);

//系统默认选中第一个,但是系统选中第一个不执行onNavigationItemSelected(MenuItem)方法,如果要求刚进入页面就执行clickTabOne()方法,则手动调用选中第一个

mBottomNavigationView.setSelectedItemId(R.id.tab_one);//根据具体情况调用

mViewPager.addOnPageChangeListener(this);

//为viewpager设置adapter

mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));

}

@Override

public boolean onNavigationItemSelected(@NonNull MenuItem item) {

//BottomNaviationView和ViewPager联动,当BottomNaviationView的某个tab按钮被选中了,同时设置ViewPager对应的页面被选中

int itemId = item.getItemId();

switch (itemId) {

case R.id.tab_one:

clickTabOne();

return true;//返回true,否则tab按钮不变色,未被选中

case R.id.tab_two:

clickTabTwo();

return true;

case R.id.tab_three:

clickTabThree();

return true;

default:

break;

}

return false;

}

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override

public void onPageSelected(int position) {

//ViewPager和BottomNaviationView联动,当ViewPager的某个页面被选中了,同时设置BottomNaviationView对应的tab按钮被选中

switch (position) {

case 0:

mBottomNavigationView.setSelectedItemId(R.id.tab_one);

break;

case 1:

mBottomNavigationView.setSelectedItemId(R.id.tab_two);

break;

case 2:

mBottomNavigationView.setSelectedItemId(R.id.tab_three);

break;

default:

break;

}

}

@Override

public void onPageScrollStateChanged(int state) {

}

private void clickTabOne() {

//为防止隔页切换时,滑过中间页面的问题,去除页面切换缓慢滑动的动画效果

mViewPager.setCurrentItem(0, false);

mTitle.setText(“One”);

}

private void clickTabTwo() {

mViewPager.setCurrentItem(1, false);

mTitle.setText(“Two”);

}

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

}

private void clickTabTwo() {

mViewPager.setCurrentItem(1, false);

mTitle.setText(“Two”);

}

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

[外链图片转存中…(img-MHQw67r6-1714797009775)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值