在Android Kotlin中无法访问dialog.getButton

问题描述

我正在尝试将系统警报对话框按钮的颜色更改为自定义颜色。我一直在尝试使用这个:

bar

但是应用程序崩溃了。 另外,dialog.create().getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getColor(R.color.bluish_grey)) 不起作用。只有set ...()方法

此外,我还尝试在dialog.getButton之后使用.getButton(),但是应用程序崩溃并显示以下错误日志。

我的警报对话框不是自定义的,它只是一个系统对话框。因此,是否可以在不使用XML的情况下将警报对话框按钮的颜色设置为自定义颜色?

这是我要实现的目标。

My desired result

这是我目前拥有的:

The current result

更新错误日志:

dialog.show()

更新了2

我创建警报的代码

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: no.company.app,PID: 26643
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setTextColor(int)' on a null object reference
        at no.meshtech.demokit.view.activity.MainActivity.showCancelDialog(MainActivity.kt:402)
        at no.meshtech.demokit.view.activity.MainActivity.startUpdate(MainActivity.kt:317)
        at no.meshtech.demokit.view.activity.MainActivity.onClick(MainActivity.kt:67)
        at android.view.View.performClick(View.java:7869)
        at android.widget.TextView.performClick(TextView.java:14958)
        at android.view.View.performClickInternal(View.java:7838)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29362)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8019)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

解决方法

您应该在setTextColor之后添加 show()

    val alertDialog = AlertDialog.Builder(this).create()
    alertDialog.setTitle(getString((R.string.app_name)))
    alertDialog.setMessage(getString(R.string.app_name))
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE,"RESUME"
    ) { dialog,which -> dialog.dismiss() }

    alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE,"ABORT"
    ) { dialog,which -> dialog.dismiss() }

    alertDialog.show()
    alertDialog.setCancelable(false)
    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(this,R.color.colorPrimary))
    alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(this,R.color.colorAccent))
,
val dialog = AlertDialog.Builder(this)
    .setTitle("Title")
    .setMessage("Message")
    .setPositiveButton("Positive") { dialog,_ ->
        // Do stuff
    }.setNegativeButton("Negative"){ dialog,_ ->
        // Do stuff
    }.create()

dialog.setCancelable(false)

dialog.setOnShowListener {
    dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(resources.getColor(R.color.colorPrimaryDark))
}

dialog.show()

您应该使用AlertDialog.Builder#create首先创建警报,然后设置#setOnShowListener,在其中可以更新文本颜色。

,

尝试使用自定义对话框, 这是代码段

 private fun showDialog(title: String) {
    val dialog = Dialog(activity)
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog.setCancelable(false)
    dialog.setContentView(R.layout.custom_layout)
    val body = dialog.findViewById(R.id.body) as TextView
    body.text = title
    val okBtn = dialog.findViewById(R.id.okBtn) as Button
    val noBtn = dialog.findViewById(R.id.noBtn) as TextView
    okBtn.setOnClickListener {
        dialog.dismiss()
    }
    noBtn.setOnClickListener { dialog.dismiss() }
    dialog.show()

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...