Không hoạt động được nhấn lại khi cài đặt của alertdialog là sai


8

Tôi có một AlertDialog và nó setCancelable()là sai. Trong Onbackpressedchức năng tôi muốn AlertDialog được đóng lại. Nhưng khi setCancelable()sai, phím lùi hoàn toàn không hoạt động. Tôi nên làm gì để thoát khỏi vấn đề này? Tôi không muốn thay đổi setCancelable()thành đúng vì tôi sẽ có một vấn đề khác.

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

Vui lòng chỉnh sửa câu hỏi của bạn bằng mã
Wahdat Kashmiri

Liệu stackoverflow.com/a/25251122/5343866 này có trả lời câu hỏi của bạn không?
animusmind

Vui lòng thêm câu trả lời mà bạn nghĩ là chính xác cho câu hỏi của tôi. Câu hỏi mà bạn đã chỉ ra không trả lời đúng. Ngoài ra xin vui lòng bỏ phiếu cho câu hỏi của tôi. @animusmind
MMG

3
Xin chào @MohammadMoeinGolchin, bạn cần ngừng nói về việc nâng cấp và hạ cấp. Thói quen này rất khó chịu khi sử dụng StackOverflow. Cho phép người dùng bỏ phiếu theo ý của họ; bạn không cần phải nói về phiếu bầu nào cả.
TASlim Oseni

Câu trả lời:


3

chỉ cần thêm một onKeyListener và hủy hộp thoại trên sự kiện phím trở lại.

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

Là mã này cho cả hộp thoại cảnh báo và hộp thoại tùy chỉnh?
MMG

đây là cho hộp thoại cảnh báo
Alif Hasnain

không chắc chắn nếu điều này sẽ làm việc trên hộp thoại tùy chỉnh.
Alif Hasnain

Tôi nghĩ bạn nói ngược lại. Nó có vấn đề cho hộp thoại cảnh báo.
MMG

1
Cảm ơn câu trả lời tốt của bạn, tiền thưởng là của bạn!
MMG

5

Cách khắc phục dễ dàng nhất cho vấn đề này là đặt OnKeyListenervà tự động phát hiện khi người dùng nhấn nút quay lại.

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

Kotlin:

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

Lưu ý rằng tôi đã thêm một điều kiện bổ sung trong câu lệnh if, tất cả điều này là để đảm bảo rằng điều này không kích hoạt hai lần.

Tôi hy vọng cái này sẽ giúp bạn.


Có phải mã của tôi trong Java mà bạn đã trả lời tôi bằng Java ?! @ Taslim Oseni
MMG

Tôi đã thêm một giải pháp Kotlin. ;-)
TASlim Oseni

1
Bạn gặp phải loại lỗi nào trong câu trả lời -Taslim Oseni @MohammadMoeinGolchin
Ali

Sao chép và dán mã của anh ấy trong Android Studio. Bạn sẽ thấy lỗi @ Ali
MMG

Bạn có thấy vấn đề không? @Ali
MMG

4

Như tôi thấy bạn tạo hộp thoại là công khai, tại sao bạn không gọi nó trong alertDialog công khai và hiển thị nó bằng alertDilog.show () và đóng lại nhấn Bấm trong hoạt động và loại bỏ hộp thoại alertDilog.dismiss () ghi đè lên onBackPress và loại bỏ nó ở đây

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

Xin chào và cảm ơn câu trả lời của bạn, mã của tôi nằm trong Kotlin, khi tôi chuyển đổi câu trả lời của bạn thành Kotlin thì nó có lỗi. Tôi đã cho bạn upvote vì thời gian bạn dành cho tôi để trả lời câu hỏi của tôi, nếu bạn thích, bạn có thể bỏ phiếu cho câu hỏi của tôi
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
            }
        })

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Samuel Liew

3

nếu bạn không muốn đóng hộp thoại khi chạm vào khu vực bên ngoài hộp thoại, bạn có thể đặt thuộc tính

    permissionDialog.setCanceledOnTouchOutside(false)

và nếu bạn muốn loại bỏ hộp thoại backpress, bạn cần gọi phương thức trên keyListener

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

Cảm ơn Raza, mã của tôi là trong Kotlin, mã này có thể hoạt động chính xác trong Java.
MMG

allowDialog là hộp thoại cảnh báo của tôi?
MMG

thay vì trình tạo hộp thoại, bạn nên sử dụng customDialog với layout.
Raza

và có sự cho phépDialog là alertDialog
Raza

Vui lòng đính kèm mã đầy đủ của bạn, cũng đừng quên bỏ phiếu cho câu hỏi của tôi, lên hoặc xuống
MMG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.