2

我正在使用 android 支持设计小部件 BottomNavigationView 来制作我的底部导航项。这是工作的结果: 在此处输入图像描述

它有两个问题,首先它不显示项目下的标题,第二个问题我希望项目填充,我不想在导航上有可用空间,我只想让它们填充空间并划分项目之间的空间。

这是我的菜单代码:

    <?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_item1"
        android:icon="@drawable/phone"
        app:showAsAction="ifRoom"
        android:title="ارتباط" />

    <item
        android:id="@+id/action_item2"
        android:icon="@mipmap/ic_history"
        app:showAsAction="ifRoom"
        android:title="سوابق خرید" />

    <item
        android:id="@+id/action_item3"
        android:icon="@drawable/sabad"
        app:showAsAction="ifRoom"
        android:title="سبد خرید" />

    <item
        android:id="@+id/action_item4"
        android:icon="@drawable/market2"
        app:showAsAction="ifRoom"
        android:title="فروشگاه" />

</menu>

这是xml代码:

` <RelativeLayout
        android:id="@+id/activity_main"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.truiton.bottomnavigation.MainActivity">

        <FrameLayout
            android:id="@+id/frame_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/navigation"
            android:animateLayoutChanges="true">

        </FrameLayout>

        <android.support.design.widget.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@color/colorPrimary"
            app:itemIconTint="#fff"
            app:itemTextColor="#F2F2F4"
            app:menu="@menu/bottom_navigation_items"/>
    </RelativeLayout>`

我该如何解决这个问题?

4

3 回答 3

10

设计支持库 28.0.0 的更新

app:labelVisibilityMode="labeled"在您的 xml 中使用。

旧答案是 28.0.0 以下支持库的解决方法

您的第一个问题,来自指南底部导航

  • “如果有四个或五个操作,则仅将非活动视图显示为图标”

对于解决方案,请检查此Android BottomNavigationView 项目显示不带文本也布局不会隐藏在滚动

于 2017-05-29T10:08:02.957 回答
4

要启用项目下的标题,请使用此技巧。在您的 BottomNavigationView 中将参数 labelVisibilityMode 设置为“已标记”。

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:layout_width="match_parent"
    android:layout_height="49dp"
    android:layout_gravity="bottom"
    app:elevation="5dp"
    **app:labelVisibilityMode="labeled"**
    app:itemIconTint="@drawable/nav_item_color_state"
    app:itemTextColor="@drawable/nav_item_color_state"
    app:layout_constraintBottom_toBottomOf="parent"
    app:menu="@menu/bottom_navigation_menu" />

有几种类型的标题可见性:

  • 标签(将保持所有标签可见。)
  • 未标记(仅显示图标)
  • selected(将仅显示所选项目和班次项目的标签)
  • 自动(将根据我们为 1-3 个项目标记并为 3+ 个项目选择的项目数量选择标记或选择)
于 2019-04-15T09:56:22.023 回答
-1

两种行为(不是问题)是默认行为。如果我对“自由空间”的理解正确,那么这个空间是通过移动动画创建的,这是BottomNavigationView的一种行为。您可以覆盖BottomNavigationView类的onLayout方法,然后您可以使用扩展标签来避免这两个。如果需要,此方法还可以为 BottomNavigationView 设置自定义字体系列。

public final class ExtendedBottomNavigationView extends BottomNavigationView{
    private final Context context;
    private Typeface fontFace = null;

    public ExtendedBottomNavigationView(Context context, AttributeSet attrs){
        super(context, attrs);
        this.context = context;
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom){
        super.onLayout(changed, left, top, right, bottom);
        final ViewGroup bottomMenu = (ViewGroup)getChildAt(0);
        final int bottomMenuChildCount = bottomMenu.getChildCount();
        BottomNavigationItemView item;
        View itemTitle;
        Field shiftingMode;

        if(fontFace == null){
            fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.VazirBold));
        }
        try {
            //if you want to disable shiftingMode:
            //shiftingMode is a private member variable so you have to get access to it like this:
            shiftingMode = bottomMenu.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(bottomMenu, false);
            shiftingMode.setAccessible(false);
        } catch (NoSuchFieldException e){
            e.printStackTrace();
        } catch (IllegalAccessException e){e.printStackTrace();}
        //for changing font face of item titles.
        for(int i=0; i<bottomMenuChildCount; i++){
            item = (BottomNavigationItemView)bottomMenu.getChildAt(i);
            //this shows all titles of items
            item.setChecked(true);
            //every BottomNavigationItemView has two children, first is an itemIcon and second is an itemTitle
            itemTitle = item.getChildAt(1);
            //every itemTitle has two children, first is a smallLabel and second is a largeLabel. these two are type of AppCompatTextView
            ((TextView)((BaselineLayout) itemTitle).getChildAt(0)).setTypeface(fontFace, Typeface.BOLD);
            ((TextView)((BaselineLayout) itemTitle).getChildAt(1)).setTypeface(fontFace, Typeface.BOLD);
        }
    }
}

然后像这样使用它:

<your.package.name.ExtendedBottomNavigationView android:id="@id/bottomMenu" style="@style/bottomMenu"/>
于 2017-10-01T15:51:35.267 回答