如果 EditText 为空,不要关闭 AlertDialog

Don't dismiss AlertDialog if EditText is empty

尽管进行了大量的搜索和试验,但如果我的 EditText 为空,我无法避免 AlertDialog 关闭...我看到这是 Whosebug 上的一个当前问题,有很多回复,但是当我尝试, 没用...

这是我的 Kotlin 代码,感谢您的帮助...

import androidx.appcompat.app.AlertDialog
import android.content.DialogInterface

private fun showMyEditextDialog() {
    val alertDialog = AlertDialog.Builder(this)

    val view = layoutInflater.inflate(R.layout.my_layout, null)
    val myedittext = view.findViewById(R.id.myedittext) as EditText


    alertDialog.setTitle(getString(R.string.title))
    alertDialog.setView(view)
    alertDialog.setCancelable(false)
    alertDialog.setPositiveButton(R.string.ok, DialogInterface.OnClickListener { dialogInterface, i ->
        var isValid = true

        if ( isEmpty(myedittext.text.toString()) ) {
            isValid = false
            Toast.makeText(this, "empty", Toast.LENGHT_SHORT).show()
        }

        if ( isValid ) {
            Toast.makeText(this, "yeah!", Toast.LENGHT_SHORT).show()        }

        if ( isValid ) {
            dialogInterface.dismiss()
        }

    })
}

我的 xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/question" />

    <EditText
        android:id="@+id/myedittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal" />


</LinearLayout>

如果我输入一个值,我会收到“是的”消息。 如果我不输入值,我会收到“empty”消息,但我的对话框会关闭...

感谢您的帮助,

我不确定是否有办法绕过警报对话框的按钮功能。如果有的话,我从来没有找到它。但是,您可以采用更简单的解决方案。只需使用 editText 和按钮创建您自己的 "alert" 视图。将视图设置为 view.setVisibility(View.INVISIBLE) 或 (View.GONE),它的任何子视图都将不可见或消失。通常,当有必要时,我会在视图后面使用半透明的黑色背景作为父视图;并来回设置该视图的可见性。然后,您可以以任何您想要的方式自定义按钮的功能和视图的其余部分。

使用 onShow 处理如下:

val dialog = alertDialog.create()
dialog.setOnShowListener {
    dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
       var isValid = true

       if ( isEmpty(myedittext.text.toString()) ) {
           isValid = false
           Toast.makeText(this@MainActivity, "empty", Toast.LENGTH_SHORT).show()
       }

       if ( isValid ) {
           Toast.makeText(this@MainActivity, "yeah!", Toast.LENGTH_SHORT).show()
           dialog.dismiss()
       }
    }
}

dialog.show()

你需要获取正面按钮来重写onclick方法

您可以使用此代码:

private fun showMyEditextDialog() {
    val alertDialog = AlertDialog.Builder(this)

    val view = layoutInflater.inflate(R.layout.my_layout, null)
    val myedittext = view.findViewById(R.id.myedittext) as EditText


    alertDialog.setTitle(getString(R.string.title))
    alertDialog.setView(view)
    alertDialog.setCancelable(false)
    alertDialog.setPositiveButton(R.string.ok, null)
    alertDialog.create()

    var dialog = alertDialog.create()
    dialog.show()
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
        var isValid = true

        if ( isEmpty(myedittext.text.toString()) ) {
            isValid = false
            Toast.makeText(this, "empty", Toast.LENGTH_SHORT).show()
        }

        if ( isValid ) {
            Toast.makeText(this, "yeah!", Toast.LENGTH_SHORT).show()        }

        if ( isValid ) {
            dialog.dismiss()
        }
    }
}