Пример минимальной привязки данных с kotlin - PullRequest
0 голосов
/ 31 марта 2020

Я просмотрел пару примеров, но либо в них слишком много абстракций, либо в устаревших руководствах. Я хотел бы реализовать эту функцию в минимально возможном порядке. Мне нужна помощь с классом UserForm, когда User передается в качестве аргументов в Навигационная Архитектура.

Модуль приложения build.gradle Я добавил это

android {
    ...
    dataBinding {
        enabled = true
    }
}

Пользователь Класс

@Parcelize
data class User(var first: String, var last: String): Parcelable

FormFragment.kt

class UserForm: Fragment() {

    private val user by lazy {
        arguments?.getParcelable("user") ?: User("John", "Doe")
    }   

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_form, container, false)
    }
}

фрагмент_форм. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable name="user" type="data.User" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <EditText
                android:id="@+id/first"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="text"
                android:text="@{user.first}" />

        <EditText
                android:id="@+id/last"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="text"
                android:text="@{user.last}" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

Некоторые фрагменты

1 Ответ

1 голос
/ 31 марта 2020

измените ваш код ниже:

FormFragment.kt

class UserForm: Fragment() {

    private val user by lazy {
        arguments?.getParcelable("user") ?: User("John", "Doe")
    }   

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val binding = FragmentFormBinding.inflate(inflater, container, false).apply {
            user = this@UserForm.user
        }
        return binding.root
    }
}

Объяснение:

  1. Поскольку вы использовали привязку данных в фрагменте. xml соответствующий класс FragmentFormBinding будет сгенерирован автоматически

  2. Обычно мы используем XxxBinding.inflate вместо inflater.inflate (layoutid, container, false)

  3. После FragmentFormBinding.inflate мы связываем пользовательский объект с фрагментом. xml

...