Какой вид следует использовать для новой навигации по конструкции материалов?

Я уверен, что вы уже слышали о добавлении нижней навигации к руководству по разработке материалов. Я планирую добавить его в свое приложение. Тем не менее, я не уверен, что лучший способ приблизиться к нему. Какое представление было бы лучше всего показать нижнюю панель?

Ответ 1

BottomNavigationView - это компонент, добавленный в Библиотека поддержки Google 25. Он обеспечивает быструю навигацию между представлениями верхнего уровня в приложении. Он должен использоваться, когда приложение имеет от трех до пяти адресов верхнего уровня. Моя реализация включает в себя переключение между фрагментами при выборе элементов меню.

Добавить в build.gradle вашего модуля проекта

compile'com.android.support:design:25.3.1'

Создайте BottomNavigationView в xml вашего макета и предоставите ему ресурс меню:

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"/>

Создайте файл здесь navigation.xml в папке ресурса меню. Этот файл используется для предоставления MenuItems в BottomNavigationView

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
   android:id="@+id/navigation_home"
   android:icon="@drawable/ic_home_black_24dp"
   android:title="@string/title_home" />
<item
   android:id="@+id/navigation_dashboard"
   android:icon="@drawable/ic_dashboard_black_24dp"
   android:title="@string/title_dashboard" />

<item
   android:id="@+id/navigation_notifications"
   android:icon="@drawable/ic_notifications_black_24dp"
   android:title="@string/title_notifications" />

<item
   android:id="@+id/navigation_settings"
   android:icon="@drawable/ic_settings_black_24dp"
   android:title="@string/title_settings" />

</menu>

Со всем в строках этот много код показывает BottomBar при запуске приложения. Теперь давайте установить прослушиватель для событий Click OnNavigationItemSelectedListener и OnNavigationItemReselectedListener на элементах меню -

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()) {
            case R.id.navigation_home:
                return true;

            case R.id.navigation_dashboard:
                return true;

            case R.id.navigation_notifications:
                return true;

            case R.id.navigation_settings:
                return true;

        }
        return true;
    }

};

private BottomNavigationView.OnNavigationItemReselectedListener mOnNavigationItemReselectedListener = new BottomNavigationView.OnNavigationItemReselectedListener() {
    @Override
    public void onNavigationItemReselected(@NonNull MenuItem item) {

        switch (item.getItemId()) {

            case R.id.navigation_home:
                Log.d(TAG, "Navigation Reselected ===");
                break;

            case R.id.navigation_dashboard:
                Log.d(TAG, "Dashboard Reselected ===");
                break;

            case R.id.navigation_notifications:
                Log.d(TAG, "Notification Reselected ===");
                break;

            case R.id.navigation_settings:
                Log.d(TAG, "Settings Reselected ===");
                break;
        }

    }
};

bottomNavigationView.setOnNavigationItemSelectedListener
(mOnNavigationItemSelectedListener);

bottomNavigationView.setOnNavigationItemReselectedListener
(mOnNavigationItemReselectedListener);

Если нет элементов меню больше 3, то выбранный элемент займет больше места в BottomNavView, и на данный момент он выглядит немного странным, может быть намеренно, Google сохранил его таким образом.

введите описание изображения здесь

Это поведение определяется свойством ShiftingMode метода BottomNavigationView, которое нельзя отключить прямолинейным способом, поскольку его api не является общедоступным. Но через Reflection есть способ сделать это:

BottomNavigationMenuView menuView = (BottomNavigationMenuView)  
btmNavigationView.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);
        //To update view, set the checked value again
        item.setChecked(item.getItemData().isChecked());
        }


    } catch (NoSuchFieldException e) {
        e.printStackTrace();

    } catch (IllegalAccessException e) {
        e.printStackTrace();

    } catch (SecurityException e) {
        e.printStackTrace();
    }

После вызова выше результата кода:

введите описание изображения здесь

Для получения дополнительной информации ознакомьтесь с моим проектом Github: https://github.com/pmahsky/BottomNavigationViewDemo

Ответ 2

A LinearLayout с равными весами для его представлений, горизонтальная ориентация. Кнопки в LinearLayout с drawableTop установлены на значок выбора.

Добавьте его к нижней части:

В FrameLayout или CoordinatorLayout вы можете добавить его к нижней части с помощью layout_gravity="bottom" или в RelativeLayout использовать android:layout_alignParentBottom="true"

Размеры, размер шрифта и т.д.:

Обратитесь к спецификациям нижней части конструкции материала об этом для полей и размеров шрифтов и т.д.:

Высота: 56dp

Значок: 24 x 24dp

Сопоставление контента:
Текст и значок центрируются по горизонтали внутри вид.

Обивка:

  • 6dp выше значка (активный вид), 8dp выше значка (неактивное представление)
  • 10dp в тексте
  • 12dp влево и вправо от текста

Текстовая метка:

  • Roboto Regular 14sp (активный просмотр)

  • Roboto Regular 12sp (неактивное представление)

Скрыть на прокрутке

Используйте CoordinatorLayout из библиотеки поддержки дизайна Android. Добавьте LinearLayout в качестве дочернего элемента в xml и установите Behavior, чтобы скрыть свиток.


Обновление

Теперь доступна библиотека с открытым исходным кодом, которая построена по спецификации: https://github.com/roughike/BottomBar

Обновление 2

Теперь часть поддержки lib.

Ответ 3

С поддержкой библиотеки поддержки android 25 у вас есть родной метод BottomNavigationView, который совпадает с рекомендациями по материальному дизайну.
Для начала нам нужно обновить нашу зависимость:

compile 'com.android.support:design:25.0.0'

Далее нам просто нужно добавить виджет "Вид снизу" в наш желаемый файл макета. Помните, что это должно быть выровнено с нижней частью экрана с отображением всего содержимого над ним. Мы можем добавить это представление так:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <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_navigation_main" />

</RelativeLayout>


Более подробную статью можно найти здесь: https://medium.com/@hitherejoe/exploring-the-android-design-support-library-bottom-navigation-drawer-548de699e8e0#.bgoj4br93