Как передать объект типа Parcelable во фрагмент с помощью плагина safeargs типа Navigation - PullRequest
0 голосов
/ 03 июня 2018

Я переписываю свое простое приложение пользовательского интерфейса для использования компонента архитектуры навигации, мне нужно передать Pojo, который реализует Parcelable, я не видел ни одного документа о том, как это сделать.

Любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Я знаю, что ответ уже есть, но это может кому-то помочь.Code snippet

В build.gradle добавить эту зависимость

ext{
     ...
     navigation_version = '1.0.0-alpha11'
}
dependencies {
     ...
     classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
}

В app / 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


   }

}
0 голосов
/ 01 октября 2018

Поскольку 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

0 голосов
/ 21 декабря 2018

Вы можете использовать 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[]" />
0 голосов
/ 03 июня 2018

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

Теперь вы можете просто передать связку при использовании метода 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...