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

 


Полный список уроков курса:


 

 

В графе у нас есть три основных объекта, у которых мы можем задавать параметры: это destination Fragment, destination Activity и action.

Рассмотрим каждый из них подробно.

 

 

 

destination Fragment

 

Пример: Fragment3 

 

Attributes

Type - это тип destination, в данном случае Fragment.

 

Label - текстовое описание. Его можно получить в коде.

Например, так:

navController.getCurrentDestination().getLabel()


Или так:

navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
   @Override
   public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
       Log.d(TAG, "onNavigate to " + destination.getLabel());
   }
});

 

Также оно будет использовано в случае интеграции с Navigation Drawer. Об этом будет следующий урок.

В качестве значения вы можете указать строковый ресурс, например: @string/fragment3_label

 


ID - уже знакомый нам атрибут, используется в методе navigate для навигации к этому destination. ID генерируется автоматически, но всегда можно ввести свое более осмысленное значение.

 

Class - класс фрагмента.

 

Set Start Destination - этой кнопкой можно destination сделать стартовым. Он будет отображаться первым при запуске.

 

 

Arguments

Возможность задать аргументы с значениями по умолчанию. Это мы подробно рассмотрели в прошлом уроке.

 

 

Actions

Список action, выходящих из этого destination. На скриншоте выше только один action, который ведет в SecondActivity. Но их может быть несколько.

 

 

Deep links

Об этом поговорим в отдельном уроке.

 

 

 

destination Activity

 

Пример: SecondActivity

 

 

Attributes

Type, Label, ID, Class - аналогичны атрибутам destination Fragment.

 

Action и Data - соответствуют стандартным полям action и data в Intent классе. Заполняете их здесь и в Activity достаете из getIntent().getAction() и getIntent().getData().

 

Pattern - это примерно то же, что и Data, но с параметрами. Т.е. вы здесь задаете свой Uri и в нем указываете имена параметров в фигурных скобках.

 

На скриншоте выше я указал Uri: content://media/photo/{folder}/{id}.jpg

У него два параметра folder и id. От нас потребуется при вызове Activity передать значения для этих параметров через Bundle.

Bundle bundle = new Bundle();
bundle.putString("folder", "camera");
bundle.putString("id", "100");
navController.navigate(R.id.secondActivity, bundle);

Параметры должны быть строковые.

 

В результате в Activity метод getIntent().getData() вернет нам: content://media/photo/camera/100.jpg

 

 

Arguments

Аналогичны аргументам destination Fragment.

  


Deep links

Об этом поговорим в отдельном уроке.

 

Обратите внимание, что нет списка Actions. Потому что граф действует только в пределах своего Activity. Переход в другое Activity - это уход из этого графа и дальнейшие перемещения будут определяться уже другим графом.

И нет кнопки Set Start Destination. Выходная из графа точка не может быть стартовой.

 

 

 

Action

 

Напомню, что action - это возможность указать дополнительные параметры при вызове destination. Рассмотрим эти параметры.

 

Пример: action из Fragment2 в Fragment3

 

 

Атрибуты

C Type и ID все понятно.

Destination - показывает, куда ведет action. Т.е. какой destination будет открыт, если вызвать метод NavController.navigate с ID этого action.

 

 

Transitions

Возможность задать анимацию перехода между destination.

Этот action ведет с Fragment2 на Fragment3. Соответственно:
Enter - анимация для появления Fragment3
Exit - анимация для исчезания Fragment2.

А когда возвращаемся с Fragment3 на Fragment2, то
Pop Enter - анимация появления Fragment2
Pop Exit - анимация исчезанияFragment3

 

Под капотом эти анимации просто передаются в FragmentTransaction: 

fragmentTransaction.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim);

 

Результат:

 

 

Argument Default Values

Аргументы берутся из destination, в который ведет action. Здесь можно задать им значения по умолчанию.

 

 

Pop Behaviour

Допустим у нас есть три destination.

Мы поочередно их открываем в Activity: fragment1 > fragment2 > fragment3.

 

По каким то причинам нам надо, чтобы при возврате назад из fragment3 мы сразу попадали в fragment1 (минуя fragment2). Для этого мы создаем action, который ведет из fragment2 в fragment3 и укажем ему Pop To = fragment1. Теперь при вызове этого action система сбросит backStack до указанного в Pop To фрагмента. 

В результате при возврате из Fragment3 попадаем в Fragment1.

Если включен чекбокс Inclusive, то destination, указанный в Pop To также будет закрыт и мы попадем на destination, который был перед ним.

 

 

Launch Options

Эти параметры зависят от того, куда ведет action: в Activity или в фрагмент.

 

Рассмотрим сначала для случая, когда action ведет в Activity.

Single Top - добавляет в Intent вызова Activity флаг Intent.FLAG_ACTIVITY_SINGLE_TOP

Document - добавляет в Intent вызова Activity флаг Intent.FLAG_ACTIVITY_NEW_DOCUMENT

Clear Task - cбрасывает стэк текущего графа до стартового destination. Добавляет в Intent вызова Activity флаг Intent.FLAG_ACTIVITY_CLEAR_TASK. Не очень понятный режим. Возможно еще просто не доведен до ума.

 

Если же action ведет в фрагмент:

Single Top - если текущий фрагмент тот же, что и вызываемый, то вызов будет проигнорирован.

Document - похоже, что никак не используется.

Clear Task - стэк текущего графа очищается до стартового фрагмента. Транзакция перехода в новый фрагмент не добавляется в backStack. Соответственно, вызываемый фрагмент заменяет текущий и становится единственным.

 

 

 

NavOptions

 

Все выше рассмотренные параметры можно задавать программно в объекте NavOptions и далее передавать этот объект в метод navigate.

Пример:

@Override
public void onFragment1NextClick() {
   NavOptions.Builder builder = new NavOptions.Builder();
   NavOptions navOptions = builder.setEnterAnim(R.anim.slide_in_right).setExitAnim(R.anim.slide_out_left).build();
   navController.navigate(R.id.fragment2, null, navOptions);
}

 

 

Используемые файлы анимации

slide_in_left.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="-50%p"
        android:toXDelta="0" />
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

 

slide_in_right.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="50%p"
        android:toXDelta="0" />
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

 

slide_out_left.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="0"
        android:toXDelta="-50%p" />
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

 

 

slide_out_right.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="0"
        android:toXDelta="50%p" />
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

 


Присоединяйтесь к нам в Telegram:

- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование 

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме 




Language

Социальные сети

 

Telegram канал



Android чат в Telegram



Группа ВКонтакте



Поддержка проекта

Яндекс
410011180491924

WebMoney
R248743991365
Z551306702056

Paypal