如何增加BottomNavigationView的宽度以填充屏幕

nik*_*l n 0 android android-layout

如何增加 BottomNavigationView 菜单的宽度。以下是当前场景。我无法增加整个屏幕的宽度。

在此输入图像描述

菜单.xml

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.idea.nikhil.googlemaps.bottomNavigationbar">

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/bottom_navigation"
            android:layout_alignParentTop="true">
        </FrameLayout>
        <android.support.design.widget.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            app:itemIconTint="@drawable/bottom_navigation_selector"
            app:itemTextColor="@drawable/bottom_navigation_selector"
            app:menu="@menu/bottom_navigation_menu"
            android:layout_alignParentBottom="true" />
    </RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

Pan*_*mar 6

这是可行的(即使没有反射)。但它会违反默认的设计规范,我建议您使用默认的设计规范


现在来看看我的解决方案......

将以下尺寸定义为dimens.xml. 这些尺寸应为values, values-largevalues-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>
Run Code Online (Sandbox Code Playgroud)

就是这样!结果会像在此输入图像描述


这不是魔法师。

为什么添加了这样的名称和值为 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);
    .....
}
Run Code Online (Sandbox Code Playgroud)

现在这些值用于创建固定宽度的视图,如下所示

@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);
        .....
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

为了使用activeMaxAvailablealways的值,我设置了一个虚拟值mActiveItemMaxWidth(在上面的尺寸中)。所以activeWidth才会有 的价值activeMaxAvailable。同样的规则适用于inactiveWidth.

因此,当您构建项目design_bottom_navigation_item_max_widthdesign_bottom_navigation_active_item_max_width定义到design-support-lib中时,将被我们定义的维度替换。

代码还根据支持的最大选项(最多 5 个)进行了验证。