Значение аргумента по умолчанию для действия в Jetpack Navigation

Можно ли установить значение аргумента по умолчанию для действия навигации с помощью навигации Jetpack?

У меня есть один fragment, который требует аргумента. Я хочу, чтобы значение этого аргумента было "1" при использовании navController.navigate(R.id.action1) и "2" при использовании navController.navigate(R.id.action2).

<fragment
    android:id="@+id/myFragment"
    android:name="MyFragment">

    <argument android:name="action_number" />

</fragment>

<!-- action_number should be set to 1 -->
<action
    android:id="@+id/action1"
    app:destination="@id/myFragment" />

<!-- action_number should be set to 2 -->
<action
    android:id="@+id/action2"
    app:destination="@id/myFragment" />

person Piotr Aleksander Chmielowski    schedule 23.07.2020    source источник


Ответы (1)


Используйте безопасные аргументы для передачи данных с безопасностью типов

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

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.3.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

Чтобы сгенерировать код языка Java, подходящий для модулей Java или смешанных модулей Java и Kotlin, добавьте эту строку в файл build.gradle вашего приложения или модуля:

apply plugin: "androidx.navigation.safeargs"

Передайте аргументы Kotlin:

override fun onClick(v: View) {
   val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
   val amount = amountTv.text.toString().toInt()
   val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
   v.findNavController().navigate(action)
}

Java:

@Override
public void onClick(View view) {
   EditText amountTv = (EditText) getView().findViewById(R.id.editTextAmount);
   int amount = Integer.parseInt(amountTv.getText().toString());
   ConfirmationAction action =
           SpecifyAmountFragmentDirections.confirmationAction()
   action.setAmount(amount)
   Navigation.findNavController(view).navigate(action);
}

В коде получателя используйте метод getArguments() для извлечения пакета и использования его содержимого.

Котлин:

val args: ConfirmationFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val tv: TextView = view.findViewById(R.id.textViewAmount)
    val amount = args.amount
    tv.text = amount.toString()
}

Java:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    TextView tv = view.findViewById(R.id.textViewAmount);
    int amount = ConfirmationFragmentArgs.fromBundle(getArguments()).getAmount();
    tv.setText(amount + "")
}

Дополнительные сведения: Передача данных между пунктами назначения

person chand mohd    schedule 23.07.2020
comment
Таким образом, я должен передать значение аргумента перед вызовом navigate (например, передать amount в SpecifyAmountFragmentDirections.confirmationAction(amount)). Я ищу решение, в котором значение аргумента установлено по умолчанию - с разными значениями для каждого <action> - person Piotr Aleksander Chmielowski; 23.07.2020