首页 > 解决方案 > 在 Android Studio 中使用 Kotlin 更改文本值

问题描述

Kotlin 的新手,我遵循了有关如何设置基本“按下按钮并更改文本”的指南但是每当我按下按钮时,应用程序就会崩溃并在调试器中得到

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)'
                                on a null object reference at com.example.myapplication.MainActivity.One(MainActivity.kt:16)

这是我当前的 MainActivity.KT:

    package com.example.myapplication
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.TextView
    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    
        fun One(view: android.view.View) {
           val onetext = view.findViewById<TextView>(R.id.textView)
            onetext.text = "Hello"
        }
    }

还有我的activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="168dp"
            android:layout_height="90dp"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="One"
            android:text="Button"
            tools:layout_editor_absoluteX="163dp"
            tools:layout_editor_absoluteY="462dp" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>

谢谢!

标签: androidkotlin

解决方案


The problem is onetext is null, which means view.findViewById<TextView>(R.id.textView) didn't find a view with textView as id inside of view. The view passed in the function is the button, which has no textView as a child. You need to search for the textView in a view higher in the hierarchy.

In the specific example, one way of doing that is by omitting the view receiver, like so:

package com.example.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun One(view: android.view.View) {
       val onetext = findViewById<TextView>(R.id.textView)
       onetext.text = "Hello"
    }
}

This way it will search for the textView id in the Activity's view, which is the activity_main layout.


推荐阅读