#android #android-studio #kotlin #kotlin-android-extensions #android-viewbinding
Вопрос:
Недавно я перенес метод привязки с Kotlin synthetics на привязку Jetpack view. У меня есть AutoFitTextView (от grantland) в моем фрагменте, и я установил некоторый текст в textview. После того, как я начал действие и прикрепил фрагмент, приложение вышло из строя. Ошибка гласила
java.lang.ClassCastExceptioni: androidx.appcompt.виджет.AppCompatTextView не может быть передан мне.grantland.widget.Автофиттекстовое представление
Итак, я решил перейти с AutoFitTextView на AppCompatTextView, но столкнулся с другой проблемой. Я не могу создать приложение, потому что произошла ошибка
Неразрешимая ссылка: Заданный текст
Я пробовал различные методы набора текста, но ни один из них не работает. Похоже, что TextView рассматривается как представление, поэтому у него нет метода setText.
========
Детали конфигурации
- Android Studio 4.1.2
- Версия buildtools 28.0.3
- jvmTarget 1.8
- com.android.привязка данных:компилятор 3.1.4
- androidx.appcommpat:совместимость с приложениями:1.2.0
==========
fragment_main.xml
<FrameLayout
.... >
<LinearLayout
.... >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<me.grantland.widget.AutofitTextView
android:id="@ id/myTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="This is textview" />
....
</LinearLayout>
</LinearLayout>
</FrameLayout>
Задать текст
FragmentMainBinding.myTextView.text = «Новый текст»
Комментарии:
1. Предоставьте свой код.
2. @Eyosiyas Добавил.
Ответ №1:
Я нашел причину!! Это моя ошибка. У меня есть 2 макета с одинаковым названием, один для портрета, а другой для пейзажа. Я переношу представления в портретной компоновке, но не в альбомной, поэтому при создании класса привязки он генерирует два разных текстовых представления как представление, а представление не имеет атрибута «текст». Вот что сказала ошибка.
Комментарии:
1. мой был фуллсенсором, чем я установил его на портрет, и это тоже сработало
Ответ №2:
Попробуйте этот образец.
val binder = FragmentMainBinding.bind(View.inflate(requireContext(), R.layout.fragment_main, null))
binder.myTextView.text = "The new text"
Комментарии:
1. Предоставьте весь макет FragmentMain и код Kotlin.
Ответ №3:
Поэтому , если это весь ваш xml fragment_main.xml
-файл, вам нужно обернуть все это <layout>
тегом. Это единственный известный компилятору способ создания классов привязки.
<layout
...>
<FrameLayout
.... >
<LinearLayout
.... >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<me.grantland.widget.AutofitTextView
android:id="@ id/myTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="This is textview" />
....
</LinearLayout>
</LinearLayout>
</FrameLayout>
</layout>
Комментарии:
1. Я думаю, что это может быть не решением проблемы. В других макетах нет тега <layout>, и он работает нормально.