android - viewex - bottomnavigationview ex




Как отключить режим сдвига BottomNavigationView? (13)

BottomNavigationView не показывает заголовок меню, которые неактивны.

Как показать названия всех элементов меню в bottomNavigationBar? Проблема в том, что в моем случае отображается только название элемента, по которому щелкают.


Чтобы полностью удалить анимацию:

Если вы также хотите избавиться от этой раздражающей маленькой анимации верхнего поля, вам нужно больше кода отражения. Вот полное решение, которое удаляет любую анимацию:

@SuppressLint("RestrictedApi")
private 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);
            item.setShiftingMode(false);

            Field shiftAmount = item.getClass().getDeclaredField("mShiftAmount");
            shiftAmount.setAccessible(true);
            shiftAmount.setInt(item, 0);
            shiftAmount.setAccessible(false);

            item.setChecked(item.getItemData().isChecked());
        }
    } catch (NoSuchFieldException e) {
        Timber.e(e, "Unable to get fields");
    } catch (IllegalAccessException e) {
        Timber.e(e, "Unable to change values");
    }
}

И убедитесь, что добавили это в ваш конфигурационный файл proguard:

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView { 
    int mShiftAmount;
}

В BottomNavigationView добавьте app:labelVisibilityMode="unlabeled"

<android.support.design.widget.BottomNavigationView
        app:menu="@menu/bn_menu"
        android:layout_height="56dp"
        android:layout_width="match_parent"
        app:labelVisibilityMode="unlabeled">

</android.support.design.widget.BottomNavigationView>

что приводит к следующему


Для обновленного ответа используем значение по умолчанию. Обновление до последней библиотеки дизайна

реализация "com.android.support:design:28.0.0"

и поместите в ваши атрибуты BottomNavigationView xml

app:itemHorizontalTranslationEnabled="false"

Вы можете поставить это также программно

bottomNavigationView.setItemHorizontalTranslationEnabled(false);

Вы можете найти источник здесь BottomNavigationView

Надеюсь, это поможет вам.


Если вы используете support: design: 28.0.0 добавьте эту строку app: labelVisibilityMode = "unlabeled" в ваш BottomNavigationView


Начиная с библиотеки поддержки 28.0.0-alpha1:

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />

ОБНОВИТЬ

в Android SDK версии 28 и выше они изменили item.setShiftingMode(false) на item.setShifting(false)

Также они убрали поле mShiftingMode

Так что использование будет

 BottomNavigationHelper.removeShiftMode(bottomNav);
 bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);


 private static final class BottomNavigationHelper {
    @SuppressLint("RestrictedApi")
    static void removeShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        for (int i = 0; i < menuView.getChildCount(); i++) {
            BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
            //noinspection RestrictedApi
            item.setShifting(false);
            item.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

            // set once again checked value, so view will be updated
            //noinspection RestrictedApi
            item.setChecked(item.getItemData().isChecked());
        }
    }
}

Работает для меня

bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

или же

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />

Реализация 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);

PS.

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

ОБНОВИТЬ

Вам также необходимо обновить конфигурационный файл proguard (например, proguard-rules.pro), приведенный выше код использует отражение и не будет работать, если proguard mShiftingMode поле mShiftingMode .

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

Спасибо Мухаммеду Альфаифи за указание на эту проблему и предоставление фрагмента .

ОБНОВЛЕНИЕ 2

Как отметила Jolanda Verhoef, новая библиотека поддержки ( 28.0.0-alpha1 ), а также новая библиотека компонентов материалов ( 1.0.0-beta01 ) предлагает открытое свойство, которое можно использовать для управления режимом смещения над 3 пунктами меню.

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>

В библиотеке компонентов материалов это также применимо, если есть 5 пунктов меню.

ОБНОВЛЕНИЕ 3

Как также указал @ThomasSunderland, вы можете установить для этого свойства значение false app:itemHorizontalTranslation="false" без Enabled постфикса, чтобы отключить смещение анимации.

Вы можете ознакомиться с полным руководством по стилю BottomNavigation here


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

Если вы столкнулись с таким странным поведением, то вот решение. Просто удали

android:fitsSystemWindows="true"

в вашем корневом макете фрагмента. Просто уберите это и бум! BottomNavigationView будет работать нормально, теперь он может быть показан с текстом и значком. У меня было это в моем корне CoordinatorLayout фрагмента.

Также не забудьте добавить

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

в вашей активности, чтобы отключить режим переключения. Хотя это не совсем связано с заданным вопросом, но все же я считаю это полезным.


Чтобы отключить текстовую анимацию и уменьшить размер шрифта, используйте это в вашем файле измерения.xml:

<dimen name="design_bottom_navigation_text_size">10sp</dimen> 
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>

Это очень просто, просто добавьте свойство в BottomNaviationView

app:labelVisibilityMode="unlabeled"

Это сторонняя библиотека, которую я использую, и она имеет много опций настройки, таких как отключение режима сдвига, отображение только значков, настройка размера значков и т. BottomNavigationViewEx


просто хочу добавить, что выше этого метода disableShiftMode добавить ниже код тоже. @SuppressLint ( "RestrictedApi")







bottomnavigationview