более 3 пунктов в нижнем меню навигации Android с использованием библиотеки поддержки дизайна

Я использую библиотеку поддержки дизайна Android V 25.0.0 для создания нижнего навигационного меню. я настроил 5 пунктов в меню. но только 3 элемента показаны с заголовком. Я хочу, чтобы все 5 элементов отображались со значками и заголовком.

кто-нибудь может достичь этого?

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/action_search"
      android:title="@string/menu_search"
      android:icon="@drawable/ic_search" />
 <item android:id="@+id/action_settings"
      android:title="@string/menu_settings"
      android:icon="@drawable/ic_add" />
   ....... three more items

файл макета

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/bottom_bar_tabs"
/>
</RelativeLayout>

person user1439582    schedule 26.01.2017    source источник
comment
может кто поможет ответить на этот вопрос   -  person user1439582    schedule 02.02.2017
comment
укажите свой android.support.design.widget.BottomNavigationView в своем основном xml   -  person kevoroid    schedule 06.02.2017
comment
Спасибо за помощь. вот мой xml-тег виджета ‹android.support.design.widget.BottomNavigationView android:id=@+id/bottom_navigation android:layout_width=match_parent android:layout_height=wrap_content android:layout_alignParentBottom=true app:itemBackground=@color/colorPrimary app: itemIconTint=@color/white приложение:itemTextColor=@color/white приложение:menu=@menu/bottom_bar_tabs /›   -  person user1439582    schedule 06.02.2017
comment
Вы добавили xmlns:app="http://schemas.android.com/apk/res-auto" к атрибутам родительского макета?   -  person kevoroid    schedule 08.02.2017
comment
да. Я добавил. вот весь мой макет .xml ‹RelativeLayout xmlns:android=schemas.android.com/apk/res /android android:layout_height=match_parent android:layout_width=match_parent android:orientation=horizontal xmlns:app=schemas.android.com/apk/res-auto  -  person user1439582    schedule 10.02.2017
comment
у меня есть пять предметов с иконками и названием. но отображаются только три нижних пункта меню с плиткой   -  person user1439582    schedule 10.02.2017
comment
отредактируйте свой пост выше с полными макетами xml. Я использовал нижнюю навигацию в своем проекте, и она работает без дополнительного/специального кода с 3-5 элементами.   -  person kevoroid    schedule 11.02.2017
comment
Я обновил пост с содержанием макета. не могли бы вы посоветовать по этому поводу. Я хочу использовать roughbike, поскольку стандартная библиотека поддержки Android не поддерживает более 3 элементов с видимым текстом.   -  person user1439582    schedule 13.02.2017


Ответы (1)


Реализация BottomNavigationView имеет условие: когда элементов больше 3, используйте режим сдвига.

На данный момент вы не можете изменить его через существующий API, и единственный способ отключить режим сдвига — использовать отражение.

Вам понадобится вспомогательный класс:

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                //noinspection RestrictedApi
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        }
    }
}

А затем примените метод disableShiftMode к вашему BottomNavigationView, но помните, что если вы расширяете представление меню из своего кода, вы должны выполнить его после раздувания.

Пример использования:

BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

Важный

Помните, что вам нужно будет выполнять этот метод каждый раз, когда вы меняете пункты меню в BottomNavigationView.

person Sambhaji Karad    schedule 18.09.2017