【问题标题】:AlertDialog dialog.dismiss(), dialog.close() not workingAlertDialog dialog.dismiss(), dialog.close() 不工作
【发布时间】:2018-05-19 21:54:33
【问题描述】:

我必须在按钮上单击两次(任意:正面、中性和负面)才能关闭 AlertDialog。

import android.annotation.SuppressLint
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.view.KeyEvent
import android.view.View
import com.example.said.puntodeventa.R.layout.layout_addproduct

class someClass : AppCompatActivity() {

@SuppressLint("StringFormatInvalid")
private fun someDialog(){
AlertDialog.Builder(this).apply {
                setTitle("title")
                setMessage("message")
                setNegativeButton("No"){ dialog, which ->
                    anEditText.text.clear()
                    anEditText.requestFocus()
                    dialog.cancel()
                    dialog.dismiss()
                }
                setNeutralButton("Neutral"){ dialog, which ->
                    someEditText.text.clear()
                    someEditText.requestFocus()
                    dialog.cancel()
                    dialog.dismiss()
                }
                setPositiveButton("Yes") { dialog, which ->
                    addProduct()
                    dialog.cancel()
                    dialog.dismiss()
                }
                create()
                show()
            }
        }

private fun addProduct(){
        //some code working properly
    }
}

addProduct().text.clear() 可以完美运行,但 AlertDialog 在我第一次单击时没有关闭。

我曾尝试单独使用dialog.cancel()dialog.dismiss(),但似乎没有任何效果,就像代码不存在一样。

我也尝试过 import android.app.AlertDialog,结果相同。

这是我单击任何按钮时日志中的红色文本,无论是第一次(AlertDialog 未关闭时)还是第二次(实际关闭时)。

05-19 16:42:34.543 24647-24647/com.example.name.appdemo E/ViewRootImpl: sendUserActionEvent() mView == null

谢谢

【问题讨论】:

  • 我不熟悉 Kotlin,但按钮定义中不应该有 DialogInterface.OnClickListener 吗? dialogBuilder.setNegativeButton("OK", DialogInterface.OnClickListener { dialog, whichButton -> //pass }) 之类的东西?
  • developer.android.com/reference/android/app/… 在使用 dialog.cancel() 时检查此文档,它正在取消您的对话框,因此您无法关闭它
  • 请检查我的答案,它不需要 DialogInterface.OnClickListener 并且我只使用了 dialog.dismiss() 并且仍然需要单击两次才能关闭。谢谢

标签: android kotlin android-alertdialog


【解决方案1】:

@说: 我复制了您的代码,它运行良好,只需单击 1 次即可关闭正面或负面按钮,所以我相信问题不在这部分。

private fun dialogCostPrice(){

    val dialogBuilder = AlertDialog.Builder(this)

    dialogBuilder.setTitle("Dialog Title")
    dialogBuilder.setMessage("Dialog Message")
    dialogBuilder.setPositiveButton("OK", { dialog, whichButton ->
        dialog.dismiss()
    })
    dialogBuilder.setNegativeButton("Cancel", { dialog, whichButton ->
        dialog.dismiss()
    })
    val b = dialogBuilder.create()
    b.show()
    }

【讨论】:

  • 是的,谢谢,查看我对@"Dav id" 的评论,我发现在使用someEditText.onKeyListener 时调用主体函数时有些奇怪,谢谢!
【解决方案2】:

不要为 get 定义点击事件的监听器DialogInterface.OnClickListener

fun showDialog() {
    val dialogBuilder = AlertDialog.Builder(this)
    val inflater = this.layoutInflater
    val dialogView = inflater.inflate(R.layout.custom_dialog, null)
    dialogBuilder.setView(dialogView)

    val editText = dialogView.findViewById<View>(R.id.editTextName) as EditText

    dialogBuilder.setTitle("Dialog Title")
    dialogBuilder.setMessage("Dialog Message")
    dialogBuilder.setPositiveButton("OK", DialogInterface.OnClickListener { dialog, whichButton ->
        //get what you need here!
    })
    dialogBuilder.setPositiveButton("Cancel", DialogInterface.OnClickListener { dialog, whichButton ->
        //get what you need here!
    })
    val b = dialogBuilder.create()
    b.show()
}

【讨论】:

  • 叫我疯了,我复制了你的答案,但仍然需要点击两次才能关闭它。 Android Studio 3.0 说我不需要 DialogInterface.OnClickLIstener 因为它是一个“冗余 SAM 构造函数”。顺便说一句,你设置了两个 setPositiveButton 所以我换了一个。我将发布我的代码作为该主题的答案,以便您可以使用格式查看它
  • @Said :: 不幸的是,我对 Kotlin 不太熟悉。我希望我能够为您提供更多帮助!
【解决方案3】:

AlertDialog 会在你点击任意按钮时自动关闭,因此无需编写dismiss() 或cancel()。

我想您显示对话框两次,这就是为什么您认为它需要单击 2 次才能关闭。

下面是运行良好的代码:

 private fun dialogCostPrice() {
    AlertDialog.Builder(this)
            .setTitle("Dialog Title")
            .setMessage("Dialog Message")
            .setPositiveButton("OK", { dialog, whichButton ->

            })
            .setNegativeButton("Cancel", { dialog, whichButton ->

            }).show()
}

而 YES DialogInterface.OnClickListener 在 kotlin 中是多余的。

【讨论】:

  • 是的,你是对的,我意识到我在从someEditText.setOnKeyListener(View.OnKeyListener({ v, keyCode, k -&gt; if (keyCode == KeyEvent.KEYCODE_ENTER) { principal() return@OnKeyListener true } false })) 调用主函数时遇到了这个问题,所以我必须改变它,ENTER 只会检查 EditText 所需的格式和addButton.setOnClickListener 将是唯一允许保存的。谢谢!
  • 如果我的回答对您有帮助,请将其标记为正确:)
【解决方案4】:

你也可以写

alertDialog.setOnDismissListener { dialog ->
            dialog.dismiss()
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2011-09-09
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多