Проблемы с представлением текста после перехода с Kotlin synthetics на привязку представления Jetpack

#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>, и он работает нормально.