我正在开发Android应用并从设计库中实现BottomNavigationView
。我看了很多例子,我无法弄清楚我的布局有什么问题。 BottomNavigationView
未显示为全宽。
另一个问题是状态栏颜色未应用。
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Include the toolbar -->
<include layout="@layout/toolbar"/>
<RelativeLayout android:id="@+id/fragment_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@android:color/white"
app:itemTextColor="@android:color/white"
app:menu="@menu/bottom_navigation_main"/>
</android.support.design.widget.CoordinatorLayout>
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
修改: 添加了未设置状态颜色的解决方案
android:fitsSystemWindows="true"
(colorPrimaryDark) status bar color not working on android v21?
答案 0 :(得分:72)
BottomNavigationView未显示为全宽。
不应该这样。
根据design guidelines,动作的宽度可以在80dp和168dp之间变化。您定义的两个动作不足以横向填充整个区域 (作为旁注,同样根据指导原则,视图应包含三到五个动作。)
如果要填充BottomNavigationView
后面的空格,可以将视图的背景颜色设置为与项目背景颜色相同的颜色:
<android.support.design.widget.BottomNavigationView
android:background="@color/bottom_view_color"
app:itemBackground="@color/bottom_view_color"
// .... />
答案 1 :(得分:17)
这是可行的。但它会再次default design specs,我建议你选择default design specs。
现在来到我的解决方案......
将以下尺寸定义为dimens.xml
。这些维度应位于values
,values-large
,values-large-land
中。如果在平板电脑中您没有看到此更改,600dp
可以在1000dp
,values-large
增加到values-large-land
或更多。
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_item_max_width" tools:override="true">600dp</dimen>
<dimen name="design_bottom_navigation_active_item_max_width" tools:override="true">600dp</dimen>
</resources>
这不是一个mazic。
为什么使用此类名称添加维度且值为600dp
BottomNavigationMenuView.java
(这是用于表示BottomNavigationView
中菜单的类)正在使用这两个维度。
下面是代码
public BottomNavigationMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
...
mInactiveItemMaxWidth = res.getDimensionPixelSize(
R.dimen.design_bottom_navigation_item_max_width);
....
mActiveItemMaxWidth = res.getDimensionPixelSize(
R.dimen.design_bottom_navigation_active_item_max_width);
.....
}
现在这些值用于创建具有固定宽度的视图,如下所示
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
....
if (mShiftingMode) {
final int inactiveCount = count - 1;
final int activeMaxAvailable = width - inactiveCount * mInactiveItemMinWidth;
final int activeWidth = Math.min(activeMaxAvailable, mActiveItemMaxWidth);
final int inactiveMaxAvailable = (width - activeWidth) / inactiveCount;
final int inactiveWidth = Math.min(inactiveMaxAvailable, mInactiveItemMaxWidth);
...
} else {
final int maxAvailable = width / count;
final int childWidth = Math.min(maxAvailable, mActiveItemMaxWidth);
.....
}
....
}
要始终使用activeMaxAvailable
的值,我将虚拟值设置为mActiveItemMaxWidth
(在上面的维度中)。所以activeWidth
会有。{1}}
值activeMaxAvailable
。同样的规则适用于inactiveWidth
。
因此,在构建项目时,design_bottom_navigation_item_max_width
和design_bottom_navigation_active_item_max_width
已定义
进入 design-support-lib ,将被我们定义的维度所取代。
代码已在最大支持选项(最多5个)上验证。
答案 2 :(得分:11)
我建议只使用
android:background="@color/bottom_view_color"
它会将条形显示为全宽,并在用户点击项目时保持涟漪效果。
如果您还添加app:itemBackground
,则会失去连锁反应。
在你的情况下
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:background="@color/colorPrimary"
app:itemIconTint="@android:color/white"
app:itemTextColor="@android:color/white"
app:menu="@menu/bottom_navigation_main"/>
答案 3 :(得分:0)
这是我的解决方案:
app:itemHorizontalTranslationEnabled = "false"
默认为真。这会“扩展”项目以适应整个宽度。