<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
style="@style/Widget.Design.BottomNavigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:background="@color/viewBackground"
app:elevation="@dimen/dp_16"
app:itemIconTint="@drawable/nav_item_color_state"
app:itemTextColor="@drawable/nav_item_color_state"
app:menu="@menu/bottom_navigation_main" />
复制代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_home"
android:enabled="true"
android:icon="@drawable/ic_home_black_24dp"
android:title="@string/home"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_knowledge_system"
android:enabled="true"
android:icon="@drawable/ic_apps_black_24dp"
android:title="@string/knowledge_system"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_wechat"
android:enabled="true"
android:icon="@drawable/ic_wechat_black_24dp"
android:title="@string/wechat"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_navigation"
android:enabled="true"
android:icon="@drawable/ic_navigation_black_24dp"
android:title="@string/navigation"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_project"
android:enabled="true"
android:icon="@drawable/ic_project_black_24dp"
android:title="@string/project"
app:showAsAction="ifRoom" />
</menu>
复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_navigation);
BottomNavigationView navigation = (BottomNavigationView)findViewById(R.id.bottom_navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_home:
return true;
case R.id.action_knowledge_system:
return true;
case R.id.action_wechat:
return true;
case R.id.action_navigation:
return true;
case R.id.action_project:
return true;
}
return false;
}
};
复制代码
public class BottomNavigationViewHelper {
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
}
复制代码
BottomNavigationViewHelper.disableShiftMode(navigation);
复制代码
另:在support版本 28 如下(不包含)使用上面的方法完美解决,那么在support版本 28 以上怎么解决呢?java
support 28
版本官方重构了BottomNavigationView
,经过查阅BottomNavigationView
与BottomNavigationMenuView
中的代码能够知道经过设置labelVisibilityMode
的显示模式来设置底部图标和字体都显示并去掉点击动画。android
因此目前 support
版本 28 能够使用下面的方法能够完美解决:bash
java代码中app
bottom_navigation.setLabelVisibilityMode(1);
复制代码
或者 xml
布局文件中ide
app:labelVisibilityMode="labeled"
复制代码
app:menu="@menu/bottom_navigation_main"
指向的 bottom_navigation_main
修改成<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_home"
android:enabled="true"
android:icon="@drawable/ic_home_black_24dp"
android:title="@string/home"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_knowledge_system"
android:enabled="true"
android:icon="@drawable/ic_apps_black_24dp"
android:title="@string/knowledge_system"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_wechat"
android:enabled="true"
android:icon="@null"
android:title=""
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_navigation"
android:enabled="true"
android:icon="@drawable/ic_navigation_black_24dp"
android:title="@string/navigation"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_project"
android:enabled="true"
android:icon="@drawable/ic_project_black_24dp"
android:title="@string/project"
app:showAsAction="ifRoom" />
</menu>
复制代码
也就是中间第三个 item
不设置图标和文字。布局
LinearLayout
中间设个一个 ImageView
覆盖在 BottomNavigationView
上便可)<FrameLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:clipToPadding="true">
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
style="@style/Widget.Design.BottomNavigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:background="@color/viewBackground"
app:elevation="@dimen/dp_16"
app:itemIconTint="@drawable/nav_item_color_state"
app:itemTextColor="@drawable/nav_item_color_state"
app:menu="@menu/bottom_navigation_main" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="16dp">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
<ImageView
android:id="@+id/navigation_center_image"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:padding="5dp"
android:src="@mipmap/ic_launcher" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>
</FrameLayout>
复制代码
item
选中和没有选中的文本大小,把它们设置成同样的就没有动画了。design_bottom_navigation_active_text_size
design_bottom_navigation_text_size
复制代码
icon
的 margin_bottom
值,能够调整它让 icon
垂直居中。design_bottom_navigation_margin
复制代码
dimen.xml
文件中便可。<!--BottomNavigationView 的选中没有选中的字体大小-->
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<!--BottomNavigationView 只放图标时的设置-->
<dimen name="design_bottom_navigation_active_text_size">0sp</dimen>
<dimen name="design_bottom_navigation_text_size">0sp</dimen>
<dimen name="design_bottom_navigation_margin">16dp</dimen>
复制代码