【问题标题】:Android Studio EditText cannot be null ErrorAndroid Studio EditText 不能为空错误
【发布时间】:2021-03-25 10:21:24
【问题描述】:

我刚迁移到 Kotlin,我想做一件非常基本的事情。在 ListView 中显示一些城市名称并使用警报对话框添加城市。这是我第一次从对话中接受输入。但是,错误“EditText 不能为空”始终存在。我在下面附上我的代码,请有人帮助我。

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>

MainActivity.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()
    }
}

【问题讨论】:

  • ID itemInput 的EditText 是否存在于activity_main.xml 中?

标签: android android-studio listview kotlin android-alertdialog


【解决方案1】:

您从活动中使用 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)

这样你就可以保留你想要显示的视图的引用

【讨论】:

    【解决方案2】:

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

    解决方案。在您的 MainActivity.kt 中,更改以下内容:

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

    到这里:

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

    【讨论】:

    • 我正在使用 activity_main 作为列表视图。 dialogLayout 仅适用于 AlertDialog
    【解决方案3】:

    像这样试试。我测试了它,它工作正常:)

    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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 2017-05-05
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多