为啥在 MainActivity.kt 中的 setOnCLickListener 中调用 AppCompatEditText 文本时无法访问?

Posted

技术标签:

【中文标题】为啥在 MainActivity.kt 中的 setOnCLickListener 中调用 AppCompatEditText 文本时无法访问?【英文标题】:Why is AppCompatEditText text not being accessed when called in setOnCLickListener in MainActivity.kt?为什么在 MainActivity.kt 中的 setOnCLickListener 中调用 AppCompatEditText 文本时无法访问? 【发布时间】:2022-01-04 23:20:19 【问题描述】:

我指的是用于创建测验应用的 YouTube 视频。我正在完全复制,但我的代码仍然不起作用。

activity_main.xml 中,我将AppCompatEditText 放在TextInputLayout 中。在MainActivity.kt 中,我尝试访问EditText 中的文本,但似乎无论我做什么,文本仍然是null,尽管我们可以在屏幕上的文本框中看到它。

MainActivity.kt

package com.example.quizapp

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import com.example.quizapp.databinding.ActivityMainBinding
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() 
    lateinit var binding : ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN

        btn_start.setOnClickListener 
            if (et_name.text.toString().isEmpty()) 
                Toast.makeText(this@MainActivity, "Please enter a name", Toast.LENGTH_SHORT).show()
             else 
                val intent = Intent(this@MainActivity, QuizQuestionsActivity::class.java)
                startActivity(intent)
                finish()
            
        
    

我尝试将 if 语句更改为 if(et_name?.text.toString().isEmpty()),但这会使代码跳到 else 语句。

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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_
    android:layout_
    android:background="@drawable/ic_bg"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_app_name"
        android:layout_
        android:layout_
        android:layout_marginBottom="30dp"
        android:gravity="center"
        android:text="@string/quizapp"
        android:textColor="@android:color/white"
        android:textSize="25sp"
        android:textStyle="bold" />

    <androidx.cardview.widget.CardView
        android:layout_
        android:layout_
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:background="@color/white"
        app:cardCornerRadius="8dp"
        app:cardElevation="5dp">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:padding="16dp">

            <TextView
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="@string/welcome"
                android:textColor="@color/dark_grey"
                android:textSize="30sp"
                android:textStyle="bold" />

            <TextView
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="@string/please_enter_your_name"
                android:textColor="@color/light_grey"
                android:textSize="16sp" />

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/til_name"
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                android:layout_
                android:layout_
                android:layout_marginTop="20dp">

                <androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/et_name"
                    android:layout_
                    android:layout_
                    android:imeOptions="actionGo"
                    android:hint="@string/name"
                    android:inputType="textCapWords"
                    android:textColorHint="@color/light_grey"
                    android:textColor="@color/dark_grey" />

            </com.google.android.material.textfield.TextInputLayout>

            <Button
                android:id="@+id/btn_start"
                android:layout_
                android:layout_
                android:layout_marginTop="16dp"
                android:background="@color/purple_500"
                android:text="@string/start"
                android:textColor="@color/white"
                android:textSize="18sp">

            </Button>
        </LinearLayout>
    </androidx.cardview.widget.CardView>

</LinearLayout>

YouTube 视频:Android masterclass: building a quiz app。他的驱动链接:His code for the app。

我的应用程序的 GitHub 存储库:QuizApp

【问题讨论】:

【参考方案1】:
binding.btn_start.setOnClickListener
            if(binding.et_name.text.isBlank()) 
                Toast.makeText(this, "Please enter a name", Toast.LENGTH_SHORT).show()
             else 
                val intent = Intent(this, QuizQuestionsActivity::class.java)
                startActivity(intent)
                finish()
            
        

顺便说一下,你应该使用viewBinding,kotlin扩展被弃用了,它可能会导致NullPoint Exception

【讨论】:

还是不行。我确实在 gradle 文件中将 viewBinding 设置为 true。我做了一些调试,发现无论我在做什么,文本仍然为空。我什至设置了 android:text :"Hello" 并再次尝试,它仍然显示为 null。 我在 github 上观察了你的代码。你有 2 个布局。如果你想使用 viewBinding。请在 2 个布局中添加相同的 id。@+id/et_name 在布局 activity_main.layout 和 layout-v21 activity_main.layout。 你可以看到ActivityMainBinding.java 它告诉你为什么小部件是@Nullable。 谢谢。它实际上是在我更新我的 android studio 后自动创建的。删除 v-21 布局文件后,我的代码工作正常。我还注意到,即使在 et_name 之前没有绑定关键字,它也能正常工作! @yansam

以上是关于为啥在 MainActivity.kt 中的 setOnCLickListener 中调用 AppCompatEditText 文本时无法访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何将片段活动添加到 MainActivity.java 或 MainActivity.kt

Android开发-kotlin基本使用(一)

颤振,原生 Admob,广告无法加载:0

Kotlin内联函数和Android方法都很重要

Android简易计算器

尝试使用 Kotlin 和 onActivityResult 将数据从 Fragment 发送到 Activity