前沿 距Google I/O(2014)最新发布的 Material Design Android 设计风格已经有一段时间了, 2016年Google在 Android Design Support Library 25基础上增加了 一个BottomNavigationView 新控件,相比之前实现导航栏的方式,如LinearLayout + TextView(使用android:drawableTop属性+selector状态切换)、LinearLayout + RelativeLayout(TextView+ImageView)
RadioGroup + RadioButton,2015年Google推出的兼容包Android Design Support Library中的TabLayout等,该控件提供更简洁的方式实现功能模块导航,符合材料设计规范,效果图如下:
BottomNavigationView 继承自 FrameLayout,
对外暴露了OnNavigationItemSelectedListener接口,便于对子视图点击事件的处理,可以通过此接口动态改变文字颜色 和图标颜色。
在XML中需要了解其以下属性
(记得添加 xmlns:app=“http://schemas.android.com/apk/res-auto”)
app:itemIconTint : 设置图标着色
app:itemTextColor : 设置文本颜色
app:menu : 设置菜单
app:itemBackground : 设置导航栏的背景色
默认该控件图标、文本都使用系统自带的@color/colorPrimary颜色 需要注意的是源码中明确指出最大子View个数不能超过5个,在子View个数大于等于4的时候 只有选中的显示文字,没有选中的只显示图标,并且会显示自带的动画,貌似看起来有些浮夸。
在源码BottomNavigationMenuView中,有一个全局变量:mShiftingMode, private boolean mShiftingMode = true;在创建、更新Menu的时候调用了buildMenuView()方法
public void buildMenuView() {
mShiftingMode = mMenu.size() > 3;
}
具体效果图如下:
下面使用BottomNavigationView+ViewPager+Fragment组合实现 导航展示界面 真机5.0.2测试
使用前打开build.gradle 添加依赖
//可以修改为你项目中对应的版本号 建议修改与 compile ‘com.android.support:appcompat-v7:25.0.0’ 相同的版本号
compile ‘com.android.support:design:25.0.0’
首先在Res目录下创建一个menu文件夹,并新建一个activity_main_bottom.xml
<?xml version="1.0" encoding="utf-8"?><item
android:id="@+id/love"
android:icon="@drawable/ic_favorite_white_24dp"
android:title="喜欢" />
<item
android:id="@+id/video"
android:icon="@drawable/ic_videogame_asset_white_24dp"
android:title="视频" />
<item
android:id="@+id/book"
android:icon="@drawable/ic_book_white_24dp"
android:title="订阅" />
<item
android:id="@+id/github"
android:icon="@drawable/ic_github_circle_white_24dp"
android:title="Github" />
MainActivity XML定义如下:
<?xml version="1.0" encoding="utf-8"?><android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.9" />
<android.support.design.widget.BottomNavigationView
android:id="@+id/main_bottom_nav_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.1"
android:background="@android:color/white"
app:itemIconTint="#be4c00"
app:itemTextColor="#be4c00"
app:menu="@menu/activity_main_bottom"
/>
BaseActivity基类简单封装如下:
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutViewId());
//initView
initView();
//initData
initData();
//initListener
initListener();
}
protected abstract void initListener();
protected abstract void initData();
protected abstract void initView();
// UI View Layout
protected abstract @LayoutRes int getLayoutViewId();
//get View ID
public <T extends View> T getViewId(int id){
View view=getWindow().getDecorView().findViewById(id);
return (T) view;
}
}
MainActivity代码如下:
package com.createfuture.android.guidenavigationbar;
import android.annotation.SuppressLint;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.createfuture.android.md50.R;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener,
ViewPager.OnPageChangeListener {
private ViewPager viewPager;//实现左右滑动的ViewPager
private ViewPager viewPager;//实现左右滑动的ViewPager
private BottomNavigationView bottomNavigationView;//底部导航栏
private List<Fragment> myFragment = new ArrayList<>();//存放Fragment集合
private String[] mTiltls = new String[]{"首页", "喜欢", "视频", "订阅", "Github"};
private long currentTime = 0;
@Override
protected int getLayoutViewId()
{
return R.layout.activity_