я не могу использовать DataBindingUtil.setContentView () с kotlin - PullRequest
0 голосов
/ 02 апреля 2020

когда я хочу начать новое действие с именем DetailActivity, мое приложение будет crash., это моя ошибка:

      E/AndroidRuntime: FATAL EXCEPTION: main
            Process: com.example.notepad, PID: 4793
            android.content.res.Resources$NotFoundException: String resource ID #0x0
                at android.content.res.Resources.getText(Resources.java:244)
                at androidx.appcompat.widget.ResourcesWrapper.getText(ResourcesWrapper.java:54)
                at android.widget.TextView.setText(TextView.java:3888)
                at com.example.notepad.databinding.ActivityDetailBindingImpl.executeBindings(ActivityDetailBindingImpl.java:115)
                at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:473)
                at androidx.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:445)
        ...

Я думаю, что это связано с setContentView. Потому что, когда я использую обычную setContentView, программа работает хорошо, но когда я использую DataBindingUtil.setContentView(), мое приложение crashs. это DetailActivity:

    import android.content.Context
    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.databinding.DataBindingUtil
    import com.example.notepad.databinding.ActivityDetailBinding

    class DetailActivity : AppCompatActivity() {
        private lateinit var binding: ActivityDetailBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_detail)


            if(intent != null) {
                binding.nameText.text = intent.getStringExtra(EXTRA_NAME)
               binding.ageText.text = intent.getStringExtra(EXTRA_AGE)
            }

        }

и это activity_detail:

    <layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        >
        <data>
            <variable
                name="person"
                type="com.example.notepad.Person" />
        </data>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".DetailActivity">

            <TextView
                android:id="@+id/name_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{person.name}"/>

            <TextView
                android:id="@+id/age_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{person.age}"/>

        </LinearLayout>
    </layout>

это класс персонажа:

class Person(var name: String , var age: Int)

[обновить] мой файл ActivityDetailBindingImpl находится в java, пока я использую kolin. может проблема в этом.

1 Ответ

1 голос
/ 02 апреля 2020

Как указывалось в моем комментарии, проблема должна быть с классом class Person(var name: String, var age: Int) и связыванием в xml:

        <TextView
            android:id="@+id/age_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{person.age}"/>

android:text="@{person.age}", структура привязки данных будет искать метод setText в TextView, который принимает один аргумент типа person.age.class, который равен Int. Это метод one , и, как вы можете видеть, он ожидает идентификатор ресурса.

Это означает, что текстовое представление будет пытаться найти строку с идентификатором, соответствующим значению Person.age который согласно вашей трассировке стека не существует.

Чтобы исправить это, либо измените тип age на String, используйте другой подход в привязке, такой как:

    <TextView
        android:id="@+id/age_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{String.valueOf(person.age)}"/>
...