Компонент архитектуры навигации - подробное представление с CollapsingToolbar - PullRequest
0 голосов
/ 13 мая 2018

Предлагаемая практика для новых навигационных компонентов была представлена ​​в I / O со следующим шаблоном и предложенной философией:

  1. Одно действие для приложения
  2. Упражнение содержит панель инструментов и нижнюю частьПанель навигации

Типичное приложение часто имеет подробный вид с CollapsingToolbar.Как можно построить это под этой архитектурой?

  • Переместить панель инструментов в каждый фрагмент XML?
  • Программно реализовать свертывающуюся панель инструментов?
  • Переместить фрагмент детали в его собственныйдеятельность (в любом случае она может использовать свою собственную ссылку) и «сломать» философию?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Предположим, что у нас есть

  1. Одно действие для приложения
  2. Упражнение содержит панель инструментов и нижнюю панель навигации

Все возможные появления для панели инструментовто, что вам нужно для вашего приложения, должно быть реализовано на этой единственной панели инструментов и быть управляемым текущим активным фрагментом.Чтобы не нарушать принцип инверсии зависимостей, все фрагменты, которым требуется функция с панели инструментов действия, должны реализовывать интерфейс.Вы можете использовать OnBackStackChangedListener для проверки обновлений представления

getFragmentManager().addOnBackStackChangedListener(
    new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment visibleFragment = ...
            if(visibleFragment instanceof ToolbarControlFragment) {
                if(visibleFragment.shouldExpandToolbar()) {
                    // set AppBarLayout expanded state
                }
                // ...
            }
        }
    }
);

Возможно, вы помните этот принцип, когда для фрагмента требуется OptionsMenu.

Я бы вообще рекомендовал иметь только одну контролируемую нижнюю панель навигациипо активности и несколько панелей инструментов во фрагментах.Это уменьшает сложность и делает компоненты приложения более независимыми.

0 голосов
/ 28 марта 2019

Типичное приложение часто имеет детальное представление с CollapsingToolbar.Как можно построить это под эту архитектуру?

Отличный вопрос!Я немного поборолся с этим и пришел к выводу, что должен быть один Activity с NavHostFragment и, в идеале, больше ничего.Это дает вам максимальную гибкость для отображения (или не отображения) того, что вам нужно для каждого экрана.Важно отметить, что ваша тема удаляет панель действий:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

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

Переместить панель инструментов в каждый фрагмент XML?

По-моему, да!Все, что вы обычно используете ActionBar, может быть сделано через панель инструментов.Вот краткий фрагмент, показывающий, как можно использовать панель инструментов для выполнения самых важных задач, которые вы использовали в ActionBar в прошлом (навигация вверх, заголовок, меню параметров и т. Д.):

toolbar.apply {
    setNavigationOnClickListener { findNavController().navigateUp() }
    setTitle(R.string.toolbar_title)
    inflateMenu(R.menu.fragment_menu)
    setOnMenuItemClickListener(::onMenuItemClick)
}

Программно реализовать свертывающуюся панель инструментов?

Это зависит от того, что именно вы пытаетесь сделать, но, скорее всего, в этом нет необходимости.Вы можете добавить AppBarLayout, CollapsingToolbarLayout и панель инструментов в свой макет и использовать их как обычно.Дайте вашему AppBarLayout наложение темы ActionBar.Вот пример:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:contentScrim="@color/primary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:navigationIcon="@drawable/ic_up_white"/>

            ...

Переместить фрагмент детали в его собственное действие (оно может использовать собственную ссылку) в любом случае и «сломать» философию?

Нетнужно для этого с вышесказанным, верно?Это достаточно гибкий подход, позволяющий легко разместить несколько уровней на одном навигационном графе и при этом иметь возможность настраивать внешний вид и поведение каждого пункта назначения на графике (включая функциональность, подобную ActionBar).

0 голосов
/ 13 сентября 2018

try

appBarLayout = (AppBarLayout) findViewById(R.id.appbar);


if(expandToolbar){
                appBarLayout.setExpanded(true,true);
            }else{
                appBarLayout.setExpanded(false,true);
            }

Вот обычная ссылка отключить развертывание CollapsingToolbarLayout для определенных фрагментов

также для других людей, желающих изменить некоторые части своего инструментаBar youследует написать свой пользовательский вид панели инструментов в отдельном XML и попытаться раздуть пользовательский вид в ваших данных. Фрагментируйте грамматически, а затем скрывайте неиспользуемые элементы старой панели инструментов, если они есть.

setSupportActionBar(toolbar);
View logo = getLayoutInflater().inflate(R.layout.view_logo, null);
toolbar.addView(logo);

и вот как вы можетескрыть нежелательные представления

for (int i = 0; i < toolbar.getChildCount(); ++i) {
        View child = toolbar.getChildAt(i);

        // here u can hide all text views for example.
        if (child instanceof TextView) {
            child.setVisibility(View.GONE );
        }
    }

этот способ намного лучше, чем написание двух действий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...