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)
这是可行的(即使没有反射)。但它会违反默认的设计规范,我建议您使用默认的设计规范。
现在来看看我的解决方案......
将以下尺寸定义为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>
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)
为了使用activeMaxAvailable
always的值,我设置了一个虚拟值mActiveItemMaxWidth
(在上面的尺寸中)。所以activeWidth
才会有 的价值activeMaxAvailable
。同样的规则适用于inactiveWidth
.
因此,当您构建项目design_bottom_navigation_item_max_width
并design_bottom_navigation_active_item_max_width
定义到design-support-lib中时,将被我们定义的维度替换。
代码还根据支持的最大选项(最多 5 个)进行了验证。