Как передать объект типа Parcelable во фрагмент с помощью плагина safeargs типа Navigation
Я переписываю свое простое приложение пользовательского интерфейса для использования компонента архитектуры навигации, мне нужно передать Pojo, который реализует Parcelable, я не видел ни одного документа о том, как это сделать.
Любая помощь будет оценена.
2 ответа
Поскольку safe-args-gradle-plugin:1.0.0-alpha03
ты можешь использовать Parcelable
объекты, используя их полное имя класса:
app:argType="com.example.app.model.Item"
Аргументы, подлежащие обработке, теперь поддерживаются, используя полное имя класса для app: type. Единственное поддерживаемое значение по умолчанию - "@null" ( https://issuetracker.google.com/issues/79563966).
Источник: https://developer.android.com/jetpack/docs/release-notes
Я знаю, что ответ уже есть, но это может кому-то помочь. Code snippet
В build.gradle добавь эту зависимость
ext{
...
navigation_version = '1.0.0-alpha11'
}
dependencies {
...
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
}
В приложении /build.gradle
apply plugin: 'androidx.navigation.safeargs'
...
В навигационном графике
<fragment
android:id="@+id/source_fragment_id"
android:name="app.test.SourceFragment"
android:label="@string/source_fragment_label"
tools:layout="@layout/source_fragment_layout">
<action
android:id="@+id/action_source_fragment_to_destination_fragment"
app:destination="@id/destination_fragment_id"
...
/>
</fragment>
<fragment
android:id="@+id/destination_fragment_id"
android:name="app.test.DestinationFragment"
android:label="@string/destination_fragment_label"
tools:layout="@layout/destination_fragment_layout">
<argument
android:name="variableName"
app:argType="app.test.data.model.CustomModel" />
...
</fragment>
Примечание. CustomModel должен быть Parcelable или Serializable.
При переходе к этому DestinationFragment из SourceFragment
val direction = SourceFragmentDirections.ActionSourceFragmentToDestinationFragment(customModel)
findNavController().navigate(direction)
Теперь извлекаем значение из пакета в DestinationFragment
...
import app.test.DestinationFragmentArgs.fromBundle
class DestinationFragment : Fragment() {
val variableName by lazy {
fromBundle(arguments!!).variableName
}
...
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Log.e(DESTINATION_FRAGMENT_TAG,"onCreateView")
//Can use CustomModel variable here i.e. variableName
}
}
Прямо сейчас вы не можете использовать безопасные аргументы с типами, кроме integer, string, inferred и reference, есть открытая проблема, требующая других типов.
Что вы можете сделать сейчас - это нормально передать пакет при использовании метода navigate() для перехода к месту назначения:
var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)
И вы можете использовать обычный getArguments
(или просто аргументы в kotlin), чтобы получить это:
val tv = view.findViewById(R.id.textViewAmount)
tv.text = arguments.getString("amount")
Ты можешь использовать boolean
, reference
, integer
, long
, string
, enum
, parcelable
и даже serializable
, Но забудь о последнем;-)
Лучше использовать последнюю версию плагина safe-args-gradle-plugin:1.0.0-alpha08
и укажите полное имя класса:
<fragment
...>
<argument
android:name="data"
app:argType="com.example.ParcelableData" />
</fragment>
от твоего
package com.example
data class ParcelableData(val content: String) : Parcelable { ... }
И вы можете отправить массивы всех argType
s:
<argument
android:name="data"
app:argType="string[]" />