Как взаимодействовать с другим фрагментом при использовании компонента архитектуры навигации? - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу добавить фрагмент B поверх фрагмента A без разрушения фрагмента A.Единственный вариант, который я вижу в библиотеке навигации, - это использовать метод навигации, чтобы открыть фрагмент, но как убедиться, что фрагмент B добавлен поверх фрагмента A, а не заменен.

navigationController.navigate(R.id.B, bundle);

и как найти экземпляр фрагментаА чтобы иметь возможность с ним взаимодействовать?

1 Ответ

0 голосов
/ 10 января 2019

Хотелось бы узнать, чтобы уточнить себя.Почему вы не хотите, чтобы фрагмент A был уничтожен при переходе к фрагменту B?

Угадайте, если вы не хотите терять состояние фрагмента A, вы можете инициализировать его в viewModel инайдите его в onCreate вашей деятельности (какой бы метод жизненного цикла вашего фрагмента вы ни выбрали, подходящие звуки).Если это не было причиной, пожалуйста, объясните, чтобы предоставить нам лучший контекст.

Для библиотеки навигации, способ выгрузки фрагментов из контейнера. вот краткое резюме библиотеки навигации

Согласно документации (которую я рекомендую вам прочитать, потому что это длинная процедура с большим количеством нечетких слов.

Если вы используете хотя бы Android Studio 3.3 или выше,

1- добавьте библиотеку навигации в проект.

dependencies {
def nav_version = "2.0.0"

implementation "androidx.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "androidx.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}

2-Создайте навигациюgraph.

Чтобы добавить график навигации в ваш проект, выполните следующие действия:

В окне Project щелкните правой кнопкой мыши каталог res и выберите New> Файл ресурсов Android.

Появится диалоговое окно «Новый файл ресурса». Введите имя в поле «Имя файла», например «nav_graph».

Выберите «Навигация» в раскрывающемся списке «Тип ресурса» и нажмите кнопку «ОК».

3- Добавление навигационного хоста к действию

в представлении xml родительского действия, в котором вы хотите, чтобы происходил обмен, в действиях, представление которых представляет представление контейнера вкоторый вы хотите обменять вв этом случае добавьте следующий фрагмент кода с соответствующим именем графика навигации.

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"

    app:defaultNavHost="true"
    app:navGraph="@navigation/my_navigation_graph_file_name" />

, а не атрибут defaultNavHost, установленный в значение true, чтобы указать библиотеке навигации, что она должна взять на себя обработку кнопки «Назад» и вверхкнопка для правильной навигации в приложении интуитивно понятным способом.

6- Добавление пунктов назначения на график.

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

Чтобы добавитьНовый тип назначения с помощью Редактора навигации выполните следующие действия:

В Редакторе навигации щелкните значок «Новое назначение», а затем нажмите «Создать новое назначение».

В диалоговом окне «Новый компонент Android», которыйпоявится ваш фрагмент.Для получения дополнительной информации о фрагментах см. Документацию по фрагментам.

7- Назначьте пункт назначения в качестве начального пункта назначения

Как только все пункты назначения будут на месте, вы можетевыберите начальный пункт назначения, выполнив следующие действия:

На вкладке «Дизайн» щелкните пункт назначения, чтобы выделить его.

Щелкните правой кнопкой мыши пункт назначения и выберите «Установить как пункт назначения начала».

8- Подключение адресатов

  • На вкладке «Дизайн» наведите указатель мыши на правую сторону пункта назначения, по которому вы хотите, чтобы пользователи перемещались.Круг появляется справа от пункта назначения.

  • Нажмите и перетащите курсор на пункт назначения, к которому пользователи должны перейти, и отпустите.Результирующая строка между двумя пунктами назначения представляет действие.

  • Нажмите на стрелку, чтобы выделить действие.На панели «Атрибуты» отображаются следующие атрибуты:

Поле «Тип» содержит «Действие».Поле ID содержит идентификатор для действия.Поле «Назначение» содержит идентификатор фрагмента или действия.

Перейдите на вкладку «Текст», чтобы перейти к представлению XML.Элемент действия теперь добавлен к месту назначения источника.Действие имеет идентификатор и атрибут назначения, который содержит идентификатор следующего назначения, как показано на следующем рисунке: enter image description here

9- Навигация к месту назначения

Навигация к месту назначения осуществляется с помощью NavController, объекта, который управляет навигацией приложения в NavHost.Каждый NavHost имеет свой собственный соответствующий NavController.

Чтобы извлечь NavController для фрагмента, действия или представления, используйте один из следующих методов:

NavHostFragment.findNavController(Fragment)

Navigation.findNavController(Activity, @IdRes int viewId)

Navigation.findNavController(View)

После получения NavController используйтеего метод navigate () для навигации к месту назначения.Метод navigate () принимает идентификатор ресурса либо действия, либо места назначения.

button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment_destination_name, null));

и многие другие замечательные вещи, которые навигационная библиотека может предложить нам разработчикам Android.Избегайте очень длинных ответов, поэтому я не все включил.Рекомендуем ознакомиться с официальным документом для библиотеки навигации и компонентов архитектуры Android в целом.Надеюсь, это поможет.

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