Исключение раздувает nav_graph при передаче объекта Parcelable между фрагментами навигации - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь передать объект между фрагментами навигации. Я могу построить проект, но когда он запускается, я получаю сообщение об ошибке nav_graph, которое гласит: «Исключение, надувающее nav_graph строка 20». Строка 20 - это строка аргумента в nav_graph. Я просто добавил ключевое слово @Parcelize в начало класса, который я пытаюсь передать, и настроил nav_graph. Нужно ли делать что-то еще?

Класс команды:

@Parcelize
public class Team {
@SerializedName("idTeam")
@Expose
private String idTeam;
@SerializedName("idSoccerXML")
@Expose
private String idSoccerXML;
@SerializedName("idAPIfootball")
@Expose
private String idAPIfootball;
@SerializedName("intLoved")
@Expose
private String intLoved;
@SerializedName("strTeam")
@Expose
private String strTeam;
@SerializedName("strTeamShort")
@Expose
private String strTeamShort;

Nav_Graph:

<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/nav_graph"
app:startDestination="@id/homeFragment">
<fragment
    android:id="@+id/homeFragment"
    android:name="com.jaykallen.searchapi.ui.HomeFragment"
    android:label="HomeFragment">
    <action
        android:id="@+id/action_homeFragment_to_resultsFragment"
        app:destination="@id/resultsFragment" />
</fragment>
<fragment
    android:id="@+id/resultsFragment"
    android:name="com.jaykallen.searchapi.ui.ResultsFragment"
    android:label="ResultsFragment">
    <argument
        android:name="choice"
        app:argType="com.jaykallen.searchapi.model.Team"
        app:nullable="true" />
</fragment>
</navigation>

HomeFragment Method:

private fun choiceClicked(chosen: Team) {
    println("User clicked: ${chosen.strTeam}")
    homeViewModel.choice = chosen
    val action = HomeFragmentDirections.actionHomeFragmentToResultsFragment(chosen)
    Navigation.findNavController(view!!).navigate(action)
}

ResultsFragment Method:

private fun getSafeArgs() {
    arguments?.let {
        val args = ResultsFragmentArgs.fromBundle(it)
        teamChosen = args.choice
        if (teamChosen != null) {
            println("Safe Argument Received=${teamChosen?.strTeam}")
            updateUi(teamChosen)
        }
    }
}

1 Ответ

1 голос
/ 06 апреля 2020

Оказывается, все, что вам нужно было сделать, это реализовать интерфейс Parcelable на вашем Java объекте. Обычно, если бы вы использовали Kotlin, аннотация @Parcelize не позволила бы вам компилировать без интерфейса Parcelable. Кажется, что эта защита во время компиляции не работает для Java кода.

Используя Java объекты, вы также потеряете все автоматические возможности создания кода c, которые поставляются с @Parcelize аннотация.

Другими словами, я рекомендую преобразовать файл Java в Kotlin, если вы хотите воспользоваться аннотацией @Parcelize.

...