Cra sh с сообщением У указанного ребенка уже есть родитель - PullRequest
0 голосов
/ 31 марта 2020

Портирование кода для использования функции DataBinding и раздувание макета сгенерированным кодом.

Ниже приведен код моего фрагмента

private lateinit var binding: FragmentFormBinding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = DataBindingUtil.setContentView(activity!!, R.layout.fragment_form)
    return binding.root
    // return inflater.inflate(R.layout.fragment_form, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding.user = User("john", "doe")
}

Мой код формы фрагмента выглядит следующим образом с одним поле для имени.

фрагмент_формы

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">

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

      <androidx.constraintlayout.widget.ConstraintLayout
        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:layout_marginEnd="4dp"
                    android:ems="10"
                    android:hint="@string/first"
                    android:inputType="text"
                    android:text="@{user.first}" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

Ошибка

enter image description here

1 Ответ

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

DataBindingUtil.setContentView() заменяет вид содержимого действия заданным макетом. Это также означает, что раздутый макет добавляется в родительский макет.

Фрагмент onCreateView() должен возвращать макет, который не добавлен ни в один из родительских макетов.

Замените ваш DataBindingUtil.setContentView(...) с чем-то вроде

DataBindingUtil.inflate(inflater, R.layout.fragment_form, container, false)
...