【问题标题】:Not working onbackpressed when setcancelable of alertdialog is false当 alertdialog 的 setcancelable 为 false 时不工作 onbackpressed
【发布时间】:2020-06-13 05:00:23
【问题描述】:

我有一个 AlertDialog,它的 setCancelable() 是假的。在Onbackpressed 函数中,我希望关闭 AlertDialog。但是当setCancelable() 为假时,后退键根本不起作用。我应该怎么做才能摆脱这个问题?我不想将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()
    }
}

【问题讨论】:

  • 请用代码编辑您的问题
  • 这个stackoverflow.com/a/25251122/5343866 回答你的问题了吗?
  • 嘿@MohammadMoeinGolchin,你需要停止谈论赞成和反对。这个习惯在 StackOverflow 上是非常不受欢迎的。允许用户自行投票;你根本不需要谈论投票。

标签: android kotlin android-alertdialog back onbackpressed


【解决方案1】:
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
            }
        })

【讨论】:

【解决方案2】:

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

希望对你有帮助。

【讨论】:

  • 我的 Java 代码是你用 Java 回答我的吗?!@Taslim Oseni
  • 我添加了一个 Kotlin 解决方案。 ;-)
  • 你遇到什么样的错误 -Taslim Oseni answer @MohammadMoeinGolchin
  • 将他的代码复制并粘贴到 Android Studio 中。你会看到错误@Ali
  • 你确定吗?有什么变化吗?@TaslimOseni
【解决方案3】:

只需添加一个 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
        }
    }

【讨论】:

  • 此代码是否适用于警报对话框和自定义对话框?
  • 这是警报对话框
  • 我想你说的反之亦然。警告对话框有问题。
  • 很高兴有用:)
【解决方案4】:

如果你不想在对话框区域外触摸时关闭对话框,你可以设置属性

    permissionDialog.setCanceledOnTouchOutside(false)

如果你想在 backpress 上关闭对话框,你需要调用 keyListener 上的方法

 permissionDialog?.setOnKeyListener { dialog, keyCode, _ ->
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            dialog?.dismiss()
            true
        }
        false
    }

【讨论】:

  • 感谢 Raza,我的代码在 Kotlin 中,这段代码在 Java 中可能正常工作。
  • permissionDialog 是我的警报对话框吗?
  • 而不是 dialog builder ,您应该使用 customDialog 和布局。
  • 是的 permissionDialog 是 alertDialog
【解决方案5】:

正如我所见,您创建的 dialogBu​​ilder 是公共的,为什么不在公共 alertDialog 中调用它,而不是使用 alertDilog.show() 显示它并在活动中关闭后按单击并关闭对话框 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()}

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多