MMG*_*MMG 8 android back android-alertdialog kotlin onbackpressed
我有一个 AlertDialog,它setCancelable()是假的。在Onbackpressed函数中,我希望关闭 AlertDialog。但是当setCancelable()为 false 时,后退键根本不起作用。我应该怎么做才能摆脱这个问题?我不想改成setCancelable()真,因为我会有另一个问题。
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()
}
}
Run Code Online (Sandbox Code Playgroud)
只需在返回键事件上添加一个 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
}
}
Run Code Online (Sandbox Code Playgroud)
此问题最简单的解决方法是设置一个OnKeyListener并自动检测用户何时点击后退按钮。
爪哇:
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;
}
Run Code Online (Sandbox Code Playgroud)
科特林:
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
}})
Run Code Online (Sandbox Code Playgroud)
请注意,我在 if 语句中添加了一个额外的条件,所有这些都是为了确保它不会触发两次。
我希望这可以帮助你。
正如我所看到的,您创建的 dialogBuilder 是公开的,为什么不在公共 alertDialog 中调用它,然后使用 alertDilog.show() 显示它,然后在活动中关闭 backpressClick 并关闭对话框 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()}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
863 次 |
| 最近记录: |