BottomNavigationView不是全宽

时间:2017-01-02 20:26:35

标签: android material-design bottom-sheet

我正在开发Android应用并从设计库中实现BottomNavigationView。我看了很多例子,我无法弄清楚我的布局有什么问题。 BottomNavigationView未显示为全宽。

另一个问题是状态栏颜色未应用。

enter image description here

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?

4 个答案:

答案 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。这些维度应位于valuesvalues-largevalues-large-land中。如果在平板电脑中您没有看到此更改,600dp可以在1000dpvalues-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>

就是这样!!!结果将类似于enter image description here

这不是一个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_widthdesign_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"

默认为真。这会“扩展”项目以适应整个宽度。