Android Kotlin findViewById不能为null

Vec*_*tor 4 android android-alertdialog kotlin

我们已经创建了一个自定义警报对话框,该对话框通过将其转换为Kotlin在Java项目中使用。java.lang.IllegalStateException下面发布的错误:findViewById(R.id.btnYES)不能为null

错误原因使我们难以理解!我们查看了许多帖子,并尝试了一些没有结果的帖子。Activity结构如下:PageTwoActivity具有自己的XML文件,并带有两个按钮。自定义对话框具有其自己的xml文件。这是PageTwoActivity代码。没有两个用于PageTwoActivity的按钮,名称冲突

import android.app.Dialog
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast

class PageTwoActivity : AppCompatActivity() {
internal lateinit var btnBACK: Button
internal lateinit var btnDIALOG: Button

internal lateinit var btnYES: Button
internal lateinit var btnNO: Button
internal lateinit var etStudentName:EditText
var EnteredText: String = ""

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_page_two)

    btnBACK = findViewById(R.id.btnBACK)
    btnDIALOG = findViewById(R.id.btnDIALOG)

    btnYES = findViewById(R.id.btnYES)
    btnNO = findViewById(R.id.btnNO)
    etStudentName = findViewById(R.id.etStudentName)
    addListenerOnButtonBACK()
    addListenerOnButtonDIALOG()

    Toast.makeText(this@PageTwoActivity, "You are on Page Two", 
    Toast.LENGTH_LONG).show()

}// END onCreate
Run Code Online (Sandbox Code Playgroud)

这是“自定义”对话框的代码

    private fun doCustom() {

    val openDialog = Dialog(this)
    openDialog.setContentView(R.layout.custom_dialog)
    //val btnYES = view!!.findViewById<Button>(R.id.btnYES)
    //val btnNO = openDialog.findViewById(R.id.btnNO)
    //val etStudentName = openDialog.findViewById(R.id.etStudentName)
    openDialog.setCancelable(false)


    btnYES.setOnClickListener(View.OnClickListener {
        EnteredText = etStudentName.getText().toString().trim({ it <= ' ' })
        if (EnteredText.isEmpty()) {
            Toast.makeText(applicationContext, "Enter Your Name\n\n OR Click 
     DECLINE", Toast.LENGTH_LONG).show()
            return@OnClickListener
        }
        Toast.makeText(applicationContext, "Registered $EnteredText", 
        Toast.LENGTH_SHORT).show()
        openDialog.dismiss()
    })

    btnNO.setOnClickListener(View.OnClickListener {
        EnteredText = ""
        val intent = Intent(this@PageTwoActivity, MainActivity::class.java)
        startActivity(intent)
        openDialog.dismiss()
    })
    openDialog.show()
}
Run Code Online (Sandbox Code Playgroud)

自定义对话框的XML文件代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="400dp"
android:layout_height="200dp"
android:background="@color/color_lightGray">

<TextView
    android:id="@+id/tvDAT"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="70dp"
    android:layout_marginTop="30dp"
    android:text="Enter First and Last Name"
    android:textColor="@color/color_Black"
    android:textSize="22sp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/etStudentName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="80dp"
    android:ems="14"
    android:gravity="center"
    android:inputType="textPersonName"
    android:text=""
    android:textColor="@color/color_Black"
    android:textSize="20sp"
    android:textStyle="bold" />

<Button
    android:id="@+id/btnYES"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="250dp"
    android:layout_marginTop="120dp"
    android:background="@color/color_Transparent"
    android:text="TAKE QUIZ"
    android:textColor="@color/color_deepBlue"
    android:textSize="22sp"
    android:textStyle="bold" />

<Button
    android:id="@+id/btnNO"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="22dp"
    android:layout_marginTop="120dp"
    android:background="@color/color_Transparent"
    android:text="DECLINE"
    android:textColor="@color/color_deepBlue"
    android:textSize="22sp"
    android:textStyle="bold" />

   </RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

所以问题是我们如何解决错误?我们应该扩大自定义对话框xml吗?如您所见,我们试图将声明移至doCustom函数中以查找id // val btnYES = view !!。findViewById(R.id.btnYES)此链接提供了建议,但我们不知道从哪里开始 LINK

小智 5

正如@Declan Nnadozie已经提到的那样:btnYES = findViewById(R.id.btnYES)返回,null因为btnYES不是contentView膨胀为的视图PageTwoActivity。 可以在对话框 中突出显示的内容中找到
按钮btnYESbtnNO和EditText etStudentName
在Kotlin中,您也不需要findViewById来访问活动的视图。
您可以删除所有这些:

internal lateinit var btnBACK: Button
internal lateinit var btnDIALOG: Button

internal lateinit var btnYES: Button
internal lateinit var btnNO: Button
internal lateinit var etStudentName:EditText
Run Code Online (Sandbox Code Playgroud)

我的建议是使用以下代码:

class PageTwoActivity : AppCompatActivity() {
var EnteredText: String = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_page_two)

        addListenerOnButtonBACK()
        addListenerOnButtonDIALOG()

        Toast.makeText(this@PageTwoActivity, "You are on Page Two",
            Toast.LENGTH_LONG).show()
    }

    fun doCustom(v: View) {
        val openDialog = Dialog(this)
        openDialog.setContentView(R.layout.custom_dialog)
        val btnYES = openDialog.findViewById<Button>(R.id.btnYES)
        val btnNO = openDialog.findViewById<Button>(R.id.btnNO)
        val etStudentName = openDialog.findViewById<EditText>(R.id.etStudentName)
        openDialog.setCancelable(false)

        btnYES.setOnClickListener(View.OnClickListener {
            EnteredText = etStudentName.getText().toString().trim({ it <= ' ' })
            if (EnteredText.isEmpty()) {
                Toast.makeText(applicationContext, "Enter Your Name\n\n OR Click DECLINE", Toast.LENGTH_LONG).show()
                        return@OnClickListener
            }
            Toast.makeText(applicationContext, "Registered $EnteredText", Toast.LENGTH_SHORT).show()
            openDialog.dismiss()
        })

        btnNO.setOnClickListener(View.OnClickListener {
            EnteredText = ""
            val intent = Intent(this@PageTwoActivity, MainActivity::class.java)
            startActivity(intent)
            openDialog.dismiss()
        })
        openDialog.show()
    }
Run Code Online (Sandbox Code Playgroud)