Androidx BottomNavigationView странно ведет себя на разных устройствах - PullRequest
1 голос
/ 17 февраля 2020
  1. После обновления до

    implementation 'com.google.android.material:material:1.1.0'
    

На моем телефоне начал работать странный вид снизу. Высота была установлена ​​на 56dp, а значки были обрезаны, а затем, когда я установил высоту на «wrap_content», я получил огромный padding-bottom.

Я тестировал его на разных телефонах и в разных android версиях, и он ведет себя по-разному во всех из них. (Android 10.0 с высотой, установленной для переноса содержимого, ведет себя так же, как Android 7.0 , но с меньшим отступом, но все еще огромным)

«Картинки или этого не случилось»:

enter image description here

Код:

Main. xml

 <com.google.android.material.bottomnavigation.BottomNavigationView

    android:id="@+id/main_nav"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    android:background="@drawable/bottom_nav_bar"
    android:elevation="10dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    app:labelVisibilityMode="unlabeled"
    app:menu="@menu/nav_items">

</com.google.android.material.bottomnavigation.BottomNavigationView>

bottom_nav_bar. xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/colorDarkBlack"/>
    <corners android:radius="1dp"
        android:topLeftRadius="30dp"
        android:topRightRadius="30dp"
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="0dp"/>

</shape>

Main. java

        BottomNavigationView bottomNavigationView = mMainNav.findViewById(R.id.main_nav);
    BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
    bottomNavigationView.setItemIconTintList(null);
    for (int i = 0; i < menuView.getChildCount(); i++) {
        final View iconView = menuView.getChildAt(i).findViewById(com.google.android.material.R.id.icon);
        final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
        final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, displayMetrics);
        layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, displayMetrics);
        iconView.setLayoutParams(layoutParams);
    }
}

nav_items. xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/nav_home"
    android:icon="@drawable/home"
    android:title=""
    app:showAsAction="ifRoom"/>
<item
    android:id="@+id/nav_blog"
    android:icon="@drawable/glasses"
    android:title=""
    app:showAsAction="ifRoom"/>
<item
    android:id="@+id/nav_workout"
    android:icon="@drawable/workout"
    android:title=""
    app:showAsAction="ifRoom" />
<item
    android:id="@+id/nav_settings"
    android:icon="@drawable/settings"
    android:title=""
    app:showAsAction="ifRoom" />

То, что я пробовал:

  • Возвращение к «com.google. android .material: material: 1.0.0» решает проблему полностью, но я нужна новая версия.

  • Изменение стиля на устаревший style="@style/Widget.Design.BottomNavigationView", как указано в документации , ничего не делает.

  • Игра со значениями заполнения просто увеличивает кроп

  • Пытался <dimen name="design_bottom_navigation_height" tools:override="true">56dp</dimen>, но также не работает


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

Заранее спасибо!

...