警告ダイアログのsetcancelableがfalseの場合、backpressedで機能しない


8

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()
    }
}

コードで質問を編集してください
Wahdat Kashmiri

このstackoverflow.com/a/25251122/5343866はあなたの質問に答えますか?
animusmind

私の質問に対して正しいと思う回答を追加してください。あなたが指摘したその質問は正解ではありません。また、私の質問に投票してください。@animusmind
MMG

3
@MohammadMoeinGolchinさん、賛成投票と反対投票について話すのをやめる必要があります。この習慣は、StackOverflowではひどく嫌われています。ユーザーが独自の裁量で投票できるようにします。投票について話す必要はまったくありません。
Taslim Oseni

回答:


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
        }
    }

このコードはアラートダイアログとカスタムダイアログの両方に対応していますか?
MMG

これは警告ダイアログ用です
Alif Hasnain

これがカスタムダイアログで機能するかどうかは不明です。
Alif Hasnain

私はあなたがその逆を言ったと思います。警告ダイアログに問題があります。
MMG

1
あなたの良い答えをありがとう、賞金はあなたのものです!
MMG

5

この問題の最も簡単な回避策は、を設定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ステートメントに追加の条件を追加したことに注意してください。これは、これが2回発生しないことを確認するためだけです。

これがお役に立てば幸いです。


私のJavaコードはJavaで答えてくれましたか?!@ Taslim Oseni
MMG

Kotlinソリューションを追加しました。;-)
Taslim Oseni

1
どのようなエラーが発生しました-Taslim Oseniが@MohammadMoeinGolchinに回答します
Ali

彼のコードをコピーしてAndroid Studioに貼り付けます。error @ Ali
MMG

問題が見つかりましたか?@アリ
MMG

4

ご覧のとおり、dialogBu​​ilderはパブリックです。パブリックアラートダイアログでこれを呼び出して、alertDilog.show()を使用して表示し、バックプレスクリックで閉じてダイアログを閉じます。アラートアラートを無効にします。

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()}

こんにちは、あなたの答えに感謝します。私のコードはKotlinにあります。あなたの答えをKotlinに変換すると、エラーが発生します。私があなたが私の質問に答えるのに費やした時間のおかげで、私はあなたに賛成票を投じました。もし望むなら、あなたは私の質問に投票することができます
MMG

3
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
            }
        })

コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
Samuel Liew

3

ダイアログの外側の領域に触れたときにダイアログを閉じたくない場合は、プロパティを設定できます

    permissionDialog.setCanceledOnTouchOutside(false)

バックプレスのダイアログを閉じる場合は、keyListenerのメソッドを呼び出す必要があります。

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

Razaに感謝します。私のコードはKotlinにあります。このコードはJavaで正しく動作する可能性があります。
MMG

permissionDialogは私の警告ダイアログですか?
MMG

ダイアログビルダーの代わりに、レイアウト付きのcustomDialogを使用する必要があります。
ラザ

はい、permissionDialogはalertDialogです
Raza

完全なコードを添付してください。また、上または下の私の質問に投票することを忘れないでください
MMG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.