当 alertdialog 的 setcancelable 为 false 时,无法在 backpressed 上工作
Not working onbackpressed when setcancelable of alertdialog is false
我有一个 AlertDialog,它的 setCancelable()
是错误的。在 Onbackpressed
函数中,我希望关闭 AlertDialog。但是当setCancelable()
为false时,返回键根本不起作用。我应该怎么做才能摆脱这个问题?我不想将 setCancelable()
更改为 true,因为我会遇到另一个问题。
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
lateinit var dialogBuilder: AlertDialog.Builder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dialogBuilder = AlertDialog.Builder(this)
dialogBuilder.setMessage("Check your internet connection")
.setPositiveButton("OK") { _, _ ->
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
}.setCancelable(false)
.create().show()
}
}
dialogBuilder.setOnKeyListener(object : OnKeyListener() {
fun onKey(dialog: DialogInterface, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//if you want to cancel the dialog only
dialog.cancel()
//if you want to finish then
// finish()
}
return true
}
})
解决此问题的最简单方法是设置 OnKeyListener
并在用户点击后退按钮时自动检测。
Java:
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) {
dialog.cancel;
return true;
}
return false;
}
});
return dialog;
}
科特林:
dialog = AlertDialog.Builder(this)
.setCancelable(false)
.create()
dialog.show()
dialog.setOnKeyListener (object : Dialog.OnKeyListener {
override fun onKey(dialogInterface: DialogInterface, keyCode: Int, keyEvent: KeyEvent) {
if(keyCode == KeyEvent.KEYCODE_BACK and keyEvent.action == KeyEvent.ACTION_UP) {
dialog.dismiss()
true
}
false
}})
请注意,我在 if 语句中添加了一个额外的条件,所有这些都是为了确保它不会触发两次。
希望对您有所帮助。
只需添加一个 onKeyListener 并在返回键事件上取消对话框。
lateinit var dialog: AlertDialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dialog = AlertDialog.Builder(this).setMessage("Check your internet connection")
.setPositiveButton("OK") { _, _ ->
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
}.setCancelable(false)
.create()
dialog.show()
dialog.setOnKeyListener { _, keyCode, _ ->
if(keyCode == KeyEvent.KEYCODE_BACK) {
if(dialog.isShowing) {
dialog.dismiss()
}
}
true
}
}
如果您不想在触摸对话框的外部区域时关闭对话框,您可以设置 属性
permissionDialog.setCanceledOnTouchOutside(false)
如果您想在 backpress 时关闭对话框,您需要调用 keyListener 上的方法
permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_BACK) {
dialog?.dismiss()
true
}
false
}
正如我所见,您创建的 dialogBuilder 是 public 为什么不在 public alertDialog 中调用它,然后使用 alertDilog.show() 显示它,然后在 [= 中按下 pressClick 关闭15=] 并关闭对话框 alertDilog.dismiss() 覆盖 onBackPress 并在此处关闭它
val alertDialog:AlertDialog?=null
alertDialog = new AlertDialog.Builder(this)
//set icon
.setIcon(android.R.drawable.ic_dialog_alert)
//set title
.setTitle("Are you sure to Exit")
//set message
.setMessage("Exiting will call finish() method")
//set positive button
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//set what would happen when positive button is clicked
finish();
}
})
//set negative button
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//set what should happen when negative button is clicked
Toast.makeText(getApplicationContext(),"Nothing
Happened",Toast.LENGTH_LONG).show();
}
})
.show();
onBackPress(){alertDialog.dismiss()}
我有一个 AlertDialog,它的 setCancelable()
是错误的。在 Onbackpressed
函数中,我希望关闭 AlertDialog。但是当setCancelable()
为false时,返回键根本不起作用。我应该怎么做才能摆脱这个问题?我不想将 setCancelable()
更改为 true,因为我会遇到另一个问题。
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
lateinit var dialogBuilder: AlertDialog.Builder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dialogBuilder = AlertDialog.Builder(this)
dialogBuilder.setMessage("Check your internet connection")
.setPositiveButton("OK") { _, _ ->
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
}.setCancelable(false)
.create().show()
}
}
dialogBuilder.setOnKeyListener(object : OnKeyListener() {
fun onKey(dialog: DialogInterface, keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//if you want to cancel the dialog only
dialog.cancel()
//if you want to finish then
// finish()
}
return true
}
})
解决此问题的最简单方法是设置 OnKeyListener
并在用户点击后退按钮时自动检测。
Java:
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) {
dialog.cancel;
return true;
}
return false;
}
});
return dialog;
}
科特林:
dialog = AlertDialog.Builder(this)
.setCancelable(false)
.create()
dialog.show()
dialog.setOnKeyListener (object : Dialog.OnKeyListener {
override fun onKey(dialogInterface: DialogInterface, keyCode: Int, keyEvent: KeyEvent) {
if(keyCode == KeyEvent.KEYCODE_BACK and keyEvent.action == KeyEvent.ACTION_UP) {
dialog.dismiss()
true
}
false
}})
请注意,我在 if 语句中添加了一个额外的条件,所有这些都是为了确保它不会触发两次。
希望对您有所帮助。
只需添加一个 onKeyListener 并在返回键事件上取消对话框。
lateinit var dialog: AlertDialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dialog = AlertDialog.Builder(this).setMessage("Check your internet connection")
.setPositiveButton("OK") { _, _ ->
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
}.setCancelable(false)
.create()
dialog.show()
dialog.setOnKeyListener { _, keyCode, _ ->
if(keyCode == KeyEvent.KEYCODE_BACK) {
if(dialog.isShowing) {
dialog.dismiss()
}
}
true
}
}
如果您不想在触摸对话框的外部区域时关闭对话框,您可以设置 属性
permissionDialog.setCanceledOnTouchOutside(false)
如果您想在 backpress 时关闭对话框,您需要调用 keyListener 上的方法
permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_BACK) {
dialog?.dismiss()
true
}
false
}
正如我所见,您创建的 dialogBuilder 是 public 为什么不在 public alertDialog 中调用它,然后使用 alertDilog.show() 显示它,然后在 [= 中按下 pressClick 关闭15=] 并关闭对话框 alertDilog.dismiss() 覆盖 onBackPress 并在此处关闭它
val alertDialog:AlertDialog?=null
alertDialog = new AlertDialog.Builder(this)
//set icon
.setIcon(android.R.drawable.ic_dialog_alert)
//set title
.setTitle("Are you sure to Exit")
//set message
.setMessage("Exiting will call finish() method")
//set positive button
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//set what would happen when positive button is clicked
finish();
}
})
//set negative button
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//set what should happen when negative button is clicked
Toast.makeText(getApplicationContext(),"Nothing
Happened",Toast.LENGTH_LONG).show();
}
})
.show();
onBackPress(){alertDialog.dismiss()}