Android Studio EditText不能为null错误



我刚刚迁移到Kotlin,我想做一件非常基本的事情。在ListView中显示一些城市名称,并使用警报对话框添加一个城市。这是我第一次从对话框中获取输入。然而,错误";EditText不能为null"始终坚持。我在下面附上我的代码,有人请帮帮我。

dialogLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<com.google.android.material.textfield.TextInputLayout
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/itemInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter City" />
</com.google.android.material.textfield.TextInputLayout>

</FrameLayout>

主活动.kt

package com.example.ktlistview
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.*
import androidx.appcompat.app.AlertDialog
import com.google.android.material.snackbar.Snackbar
class MainActivity : AppCompatActivity() {
var m_city: String = ""
val cities = ArrayList<String>()
lateinit var listAdapter: ArrayAdapter<String>
lateinit var addItemDialog: AlertDialog.Builder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

initData()
val list = findViewById<ListView>(R.id.listView)
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, cities)
list.adapter = listAdapter
addItemDialog = AlertDialog.Builder(this)
addItemDialog.create()
addItemDialog.setTitle("Add City")
addItemDialog.setView(R.layout.dialoglayout)
val editText: EditText? = findViewById<EditText>(R.id.itemInput)
addItemDialog.setPositiveButton("Ok") { _, _ ->
m_city = editText?.text.toString()
}
addItemDialog.setNegativeButton("Cancel") { _, _ ->
Toast.makeText(this, "City not added", Toast.LENGTH_SHORT).show()
}

}
private fun initData() {
cities.add("Delhi")
cities.add("Mumbai")
cities.add("Chennai")
cities.add("Bhubaneswar")
cities.add("Pune")
cities.add("Bangalore")
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_add -> {
addItemDialog.show()
addItem()
}
}
return true
}
private fun addItem() {
cities.add("m_city")
listAdapter.notifyDataSetChanged()
}
}

从活动而非对话框中使用findViewById的问题替换:

addItemDialog.setView(R.layout.dialoglayout)
val editText: EditText? = findViewById<EditText>(R.id.itemInput)

带有:

val dialogView = LayoutInflater.from(this).inflate(R.layout.dialoglayout, null, false)
addItemDialog.setView(dialogView)
val editText: EditText? = dialogView.findViewById<EditText>(R.id.itemInput)

通过这种方式,您可以保留要显示的视图的参考

错误在于,当您实际使用dialogLayout.xml文件时,您的代码引用了activity_main.xml。

解决方案。在MainActivity.kt中,更改此项:

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

对此:

super.onCreate(savedInstanceState)
setContentView(R.layout.dialogLayout)

这样试试吧。我测试了它,它运行良好:(

private fun showDialog(context :Context) {
val addItemDialog = AlertDialog.Builder(context)
addItemDialog.create()
addItemDialog.setTitle("Add City")
val inflater = this.layoutInflater
val dialogView = inflater.inflate(R.layout.dialoglayout, null)
addItemDialog.setView(dialogView)
val editText: EditText? =  dialogView.findViewById(R.id.itemInput)
addItemDialog.setPositiveButton("Ok") { _, _ ->
m_city = editText?.text.toString()
Toast.makeText(this, "City added $m_city", Toast.LENGTH_SHORT).show()
}
addItemDialog.setNegativeButton("Cancel") { _, _ ->
Toast.makeText(this, "City not added", Toast.LENGTH_SHORT).show()
}
addItemDialog.show()
}

最新更新