如何为警报实施 "Don't show again" 选项

How to implement "Don't show again" option for Alerts

我为我的警报对话框实现了一个“不再显示”选项,但它没有按预期工作: 所有其他问题都是 6-7 岁的 java,并且由于我完全不熟悉编程,所以我现在只知道 kotlin 的基础知识..

fun showDialog() {
    val dialogBuilder = AlertDialog.Builder(context)
    val inflater = requireActivity().layoutInflater;

    dialogBuilder.setView(inflater.inflate(R.layout.alert, null))
    dialogBuilder.setMessage("Please always put the total on the bottom right corner. An example is shown below.")
    dialogBuilder.setPositiveButton("Alright, got it!",
        DialogInterface.OnClickListener { dialog, whichButton ->
            pb.visibility = View.VISIBLE
            checkPermission(Manifest.permission.CAMERA,CAMERA_PERMISSION_CODE)
            startActivityForResult(receiptsViewModel.cameraIntent(requireActivity()),REQUEST_CODE_KAMERA)
        })
    val mainView: View = inflater.inflate(R.layout.alert, null)
    checkBox = mainView.findViewById<View>(R.id.checkBox) as CheckBox
    val b = dialogBuilder.create()
    b.show()

    checkBox.setOnCheckedChangeListener { compoundButton, b ->
        if (compoundButton.isChecked) {
            storeDialogStatus(true)
        } else {
            storeDialogStatus(false)
        }
    }
    if (dialogStatus) {
        b.hide()
    } else {
        b.show()
    }
}

private fun storeDialogStatus(isChecked: Boolean) {
    val mSharedPreferences = requireActivity().getSharedPreferences("CheckItem", AppCompatActivity.MODE_PRIVATE)
    val mEditor = mSharedPreferences.edit()
    mEditor.putBoolean("item", isChecked)
    mEditor.apply()
}

private val dialogStatus: Boolean
    private get() {
        val mSharedPreferences = requireActivity().getSharedPreferences("CheckItem",
            AppCompatActivity.MODE_PRIVATE
        )
        return mSharedPreferences.getBoolean("item", false)
    }

你的逻辑好像有问题。这段代码没有按预期工作:

 if (dialogStatus) {
    b.hide()
} else {
    b.show()
}

如果用户选择退出,则根本不应创建对话框。请尝试修改后的代码:

    fun showDialog() {
        if (dialogStatus) {
            return
        }
        val dialogBuilder = AlertDialog.Builder(context)
        val inflater = requireActivity().layoutInflater

        dialogBuilder.setView(inflater.inflate(R.layout.alert, null))
            .setMessage("Please always put the total on the bottom right corner. An example is shown below.")
            .setPositiveButton("Alright, got it!",
                DialogInterface.OnClickListener { dialog, whichButton ->
                    pb.visibility = View.VISIBLE
                    checkPermission(Manifest.permission.CAMERA, CAMERA_PERMISSION_CODE)
                    startActivityForResult(
                        receiptsViewModel.cameraIntent(requireActivity()),
                        REQUEST_CODE_KAMERA
                    )
                })

        dialogBuilder.create().show()

        val mainView: View = inflater.inflate(R.layout.alert, null)
        checkBox = mainView.findViewById<CheckBox>(R.id.checkBox)

        checkBox.setOnCheckedChangeListener { compoundButton, b ->
            if (compoundButton.isChecked) {
                storeDialogStatus(true)
            } else {
                storeDialogStatus(false)
            }
        }
    }

我看到的问题是,您要添加侦听器的复选框用于您未使用的布局。您扩充了布局并将其设置为对话框视图。然后你膨胀布局的第二个副本并在未使用的第二个布局中的复选框上设置一个侦听器。

一些其他提示,但这些并不是阻止它工作的因素。它们只会让您的代码更清晰:

您可以链接生成器调用,这样您就不必一直输入 dialogBuilder.,甚至不必将其存储在变量中。

findViewById<View> 可以更改为 findViewById<CheckBox>,因此您不必将其结果强制转换为 CheckBox。

如果不需要对话框,您可以 return 尽早从函数中退出,而不是创建对话框,显示它,然后立即隐藏它。

您可以简化为 doSomething(someBoolean),而不是使用 if (someBoolean) doSomething(true) else doSomething(false)

private fun startCamera() {
    pb.visibility = View.VISIBLE
    checkPermission(Manifest.permission.CAMERA,CAMERA_PERMISSION_CODE)
    startActivityForResult(
        receiptsViewModel.cameraIntent(requireActivity()),
        REQUEST_CODE_KAMERA
    )
}

fun showDialog() {
    if (dialogStatus) {
        startCamera()
        return
    }

    val mainView = requireActivity().layoutInflater.inflate(R.layout.alert, null)
    checkBox = mainView.findViewById<CheckBox>(R.id.checkBox)
    checkBox.setOnCheckedChangeListener { compoundButton, b ->
        storeDialogStatus(compoundButton.isChecked)
    }

    AlertDialog.Builder(context)
        .setView(mainView)
        .setMessage("Please always put the total on the bottom right corner. An example is shown below.")
        .setPositiveButton("Alright, got it!") { _, _ -> startCamera() }
        .create()
        .show()
}

我也觉得很奇怪,你有一个 checkBox 的 属性 在这个函数之外不可能有用。您应该删除 属性.

此外,您应该考虑使用 DialogFragment 而不是裸对话框。裸对话框存在问题,例如它们在屏幕旋转后消失。官方文档解释了如何使用 DialogFragment。不过,我承认,我认为 DialogFragment 使用起来有点复杂,尤其是对于新手 Android 程序员。