ViewBinding - включена привязка макета, приводящая к неразрешенной ссылке

Я реализую ViewBinding в одном из своих фрагментов. Этот фрагмент имеет следующий макет:

...
<androidx.core.widget.NestedScrollView
        android:id="@+id/sv_sudf_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/btn_sudf_continue"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/eav_sudf_avatar">

        <include
            android:id="@+id/l_sudf_details"
            layout="@layout/layout_sign_up_details_fields"/>

    </androidx.core.widget.NestedScrollView>
...

Я выполнил этот ответ, но он также не работает.

Сгенерированный класс привязки представления для фрагмента имеет привязку внутри, однако тип атрибута - View. Когда я затем ссылаюсь на View, используя binding.lSudfDetails, тип будет LayoutSignUpDetailFieldsBinding. Я не могу понять, откуда берется этот тип, поскольку не существует сгенерированного класса с таким именем, однако я ожидал бы, что он назначит ему правильный тип привязки. Вот атрибут в FragmentSignUpDetailsBinding.java.

@NonNull
public final View lSudfDetails;

Однако все привязки настроены правильно, и это позволяет мне ссылаться на представления во вложенном макете, но когда я прихожу к сборке, я получаю неразрешенные ссылочные ошибки. Lint не жалуется, когда я ссылаюсь на них вот так:

binding.lSudfDetails.etSudfDob

Однако компилятор не работает с такими ошибками

Неразрешенная ссылка: etSudfDob

Сама привязка создается в соответствии с документами Android:

private var _binding : FragmentSignUpDetailsBinding? = null
private val binding get() = _binding!!

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        _binding = FragmentSignUpDetailsBinding.inflate(inflater,container,false)
        return binding.root
    }

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    binding.tvSudfWelcome.text = getString(R.string.sign_up_welcome,getString(R.string.app_name))
    binding.lSudfDetails.etSudfDob.setOnClickListener {
            showYearSelection()
    }
}

Привязка tvSudfWelcome работает как вложенная привязка, которая ему не нравится.


person StuStirling    schedule 05.03.2020    source источник
comment
является ли корневой тег layout_sign_up_details_fields <merge>?   -  person Somesh Kumar    schedule 05.03.2020
comment
@SomeshKumar нет, его корень LinearLayout. Я перейду на слияние, чтобы посмотреть, имеет ли это значение   -  person StuStirling    schedule 05.03.2020
comment
Нет, это не будет иметь никакого значения. Можете ли вы добавить код ... как вы настраиваете привязку представления, а затем как вы получаете к нему доступ?   -  person Somesh Kumar    schedule 05.03.2020
comment
@SomeshKumar Я добавил код в вопрос   -  person StuStirling    schedule 05.03.2020
comment
Это выглядит идеально. Некоторые люди сталкивались с проблемами в Android Studio 3.6.0 относительно ViewBinding. Вы используете последнюю версию Studio v 3.6.1 и gradle v 3.6.1?   -  person Somesh Kumar    schedule 05.03.2020
comment
Угу, спасибо @SomeshKumar. Я обновился с 3.6.0 до 3.6.1, и проблема решена. Отправьте сообщение как ответ, и я отмечу его как принятый   -  person StuStirling    schedule 05.03.2020


Ответы (1)


Если вы используете Android Studio 3.6.0, иногда плагину gradle не удается создать поля ViewBinding для включенных макетов. Пожалуйста, обновите Android Studio 3.6.1 и версию плагина gradle до 3.6.1.

person Somesh Kumar    schedule 05.03.2020
comment
Еще один, если вы можете помочь - stackoverflow.com/q/60549985/507313 - person StuStirling; 05.03.2020