BottomNavigationView с более чем 3 элементами: заголовок вкладки скрывается
Я использую BottomNavigationView с помощью поддержки Android Desing Library 25.
Но когда я переключаю вкладки, заголовок другой вкладки скрывается. Но нет никакой скрытой проблемы фактического Нижнего навигационного вида. Но моя прячется.
Но я хочу, чтобы это выглядело именно так. Есть идеи, как это сделать? Чего мне не хватает?
Вот мой код:
Activity_main.xml
<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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yunus.ototakip.MainActivity">
<FrameLayout
android:id="@+id/main_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:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/beyaz"
app:itemTextColor="@color/beyaz"
app:menu="@menu/bottombar_menu" />
Bottom_bar_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/bb_menu_arac"
android:enabled="true"
android:icon="@drawable/icon_car"
android:title="@string/araclarim"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_yakin"
android:enabled="true"
android:icon="@drawable/icon_yer"
android:title="@string/yakinimdakiler"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_yaklasan"
android:enabled="true"
android:icon="@drawable/icon_takvim"
android:title="@string/yaklasanlar"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_ipucu"
android:enabled="true"
android:icon="@drawable/icon_ipucu"
android:title="@string/ipuclari"
app:showAsAction="ifRoom" />
</menu>
6 ответов:
Попробуйте вот что:
В вашем
bottom_bar_menu.xml.Измените атрибутshowAsAction<item android:id="@id/menu_item" android:title="text" android:icon="@drawable/drawable_resource_name" android:showAsAction="always|withText" />В сборке.грэдл:
compile 'com.android.support:design:25.3.1'BOTTOM NAVIGATIONVIEW более 3 пунктов : используйте
removeShiftMode()методВ
BottomNavigationViewHelper.javaИспользуйте:import android.annotation.SuppressLint; import android.support.design.internal.BottomNavigationItemView; import android.support.design.internal.BottomNavigationMenuView; import android.support.design.widget.BottomNavigationView; import java.lang.reflect.Field; public class BottomNavigationViewHelper { @SuppressLint("RestrictedApi") public static void removeShiftMode(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("BottomNav", "Unable to get shift mode field", e); } catch (IllegalAccessException e) { Log.e("BottomNav", "Unable to change value of shift mode", e); } } }Назовите это с помощью:
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation); BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);Он отключит анимацию сдвига текста заголовка и позволит отображать текст.
Вот хорошее чтение
Решение с использованием отражения больше не работает, потому что поле "mShiftingMode" было удалено.
Есть простой способ сделать это сейчас: Используйте библиотеку поддержки 28 и просто добавьте
app:labelVisibilityMode="labeled"в свою XML-декларациюBottomNavigationView.Надеюсь, это поможет.
После сканирования исходного кода BottomNavigationView я нахожу
mShiftingMode = mMenu.size() > 3;В BottomNavigationMenuView.java строка 265, это означает, что пока размер меню больше 3, заголовок вкладки будет скрыт. Поэтому, если вы хотите показать заголовок вкладки, вам просто нужно получить код из сборки и изменить его на ниже.
mShiftingMode = mMenu.size() > 5;PS: BottonNavigationView максимальное количество вкладок должно быть от 3 до 5. Вы можете получить код на BottomNavigationViewNew
Создать Класс BottomNavigationViewHelper
import android.annotation.SuppressLint; 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 { @SuppressLint("RestrictedApi") 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); if(menuView.getChildCount()<6) { 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); } } }Вызов
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation); BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
Я довольно часто использовал rafsanahmad007 Ответ, но перевожу его на Котлин. Позвольте мне поделиться им для будущих странников
@SuppressLint("RestrictedApi") fun BottomNavigationView.disableShiftMode() { val menuView = this.getChildAt(0) as BottomNavigationMenuView try { val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode") shiftingMode.setAccessible(true) shiftingMode.setBoolean(menuView, false) shiftingMode.setAccessible(false) for (i in 0..(menuView.childCount - 1)) { val item = menuView.getChildAt(i) as BottomNavigationItemView item.setShiftingMode(false) // set once again checked value, so view will be updated item.setChecked(item.getItemData().isChecked()) } } catch (e: NoSuchFieldException) { Timber.e("Unable to get shift mode field") } catch (e: IllegalAccessException) { Timber.e("Unable to change value of shift mode") } }
Функция расширения Котлина:
@SuppressLint("RestrictedApi") fun BottomNavigationView.removeShiftMode(){ val menuView = this.getChildAt(0) as BottomNavigationMenuView try { val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode") shiftingMode.isAccessible = true shiftingMode.setBoolean(menuView, false) shiftingMode.isAccessible = false for (i in 0 until menuView.childCount) { val item = menuView.getChildAt(i) as BottomNavigationItemView item.setShiftingMode(false) // set once again checked value, so view will be updated item.setChecked(item.itemData.isChecked) } } catch (e: NoSuchFieldException) { e.printStackTrace() Timber.tag("BottomNav").e( e, "Unable to get shift mode field") } catch (e: IllegalAccessException) { Timber.tag("BottomNav").e( e, "Unable to change value of shift mode") } }



Comments