У меня есть это в приложении Gradle:
apply plugin: 'androidx.navigation.safeargs'
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0'
и это в проекте gradle:
classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'
навигационный график:
<navigation 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/navigation_graph"
app:startDestination = "@id/loginPhoneNumberFragment">
<fragment
android:id = "@+id/loginPhoneNumberFragment"
android:name = "...fragments.LoginPhoneNumberFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_phone_number">
<action
android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
app:destination = "@id/loginCodeFragment">
<argument
android:name = "prefix"
app:argType = "string" />
<argument
android:name = "phone_number"
app:argType = "string" />
</action>
</fragment>
<fragment
android:id = "@+id/loginCodeFragment"
android:name = "...LoginCodeFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_code" />
</navigation>
LoginPhoneNumberFragment:
val action = LoginPhoneNumberFragmentDirections.actionLoginPhoneNumberFragmentToLoginCodeFragment(prefix, phoneNumber)
view?.findNavController()?.navigate(action)
ЛогинКодФрагмент:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val prefix = LoginCodeFragmentArgs.fromBundle(arguments).prefix //LoginCodeFragmentArgs is not recognized
}
В LoginPhoneNumberFragment он создает класс «LoginPhoneNumberFragmentDirections», но в целевом классе LoginCodeFragment он не распознает «LoginCodeFragmentArgs».
Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает? (Я очистил и перестроил и попробовал Invalidate caches...)
Итак, после долгих поисков я обнаружил свою ошибку - аргументы должны быть на фрагменте Назначения, а не на стартовом:
<navigation 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/navigation_graph"
app:startDestination = "@id/loginPhoneNumberFragment">
<fragment
android:id = "@+id/loginPhoneNumberFragment"
android:name = "...fragments.LoginPhoneNumberFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_phone_number">
<action
android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
app:destination = "@id/loginCodeFragment">
</action>
</fragment>
<fragment
android:id = "@+id/loginCodeFragment"
android:name = "...fragments.LoginCodeFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_code" >
<argument
android:name = "prefix"
app:argType = "string"
android:defaultValue = "888" />
<argument
android:name = "phone_number"
app:argType = "string"
android:defaultValue = "88888888"/>
</fragment>
</navigation>
Вы также можете добавить его вручную через дизайн навигационного графа - нажмите на целевой фрагмент и нажмите «+» в разделе аргументов, он добавит его в текстовый файл.
Спасибо за это! Это действительно не так ясно в документации...
Ты спас мою жизнь
Отлично! Эти две строки должны быть включены в официальную документацию и также исправить неправильный пример.
Аргумент должен быть в целевом фрагменте, как показано ниже, а не внутри действия в исходном фрагменте.
<navigation 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/navigation_graph"
app:startDestination = "@id/loginPhoneNumberFragment">
<fragment
android:id = "@+id/loginPhoneNumberFragment"
android:name = "...fragments.LoginPhoneNumberFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_phone_number">
<action
android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
app:destination = "@id/loginCodeFragment"/>
</fragment>
<fragment
android:id = "@+id/loginCodeFragment"
android:name = "...LoginCodeFragment"
android:label = "@string/login_activity_title"
tools:layout = "@layout/fragment_login_code">
<argument
android:name = "prefix"
app:argType = "string" />
<argument
android:name = "phone_number"
app:argType = "string" />
</fragment>
</navigation>
Кроме того, это не должно быть в теге «действие».