当 alertdialog 的 setcancelable 为 false 时,无法正常工作

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)

Ali*_*ain 6

只需在返回键事件上添加一个 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)


Tas*_*eni 5

此问题最简单的解决方法是设置一个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 语句中添加了一个额外的条件,所有这些都是为了确保它不会触发两次。

我希望这可以帮助你。

  • 你遇到了什么错误 -Taslim Oseni 回答@MohammadMoeinGolchin (2认同)

Ami*_*dey 5

正如我所看到的,您创建的 dialogBu​​ilder 是公开的,为什么不在公共 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)