user2638180
user2638180

Reputation: 1023

Cannot change background color of AlertDialog button

I'm trying to change the color of the AlertDialog with likely all solutions defined for this issue in stackoverflow and it still doesn't work.

This is the code I'm using to try to achieve that:

 val vacationDialog = AlertDialog.Builder(fragment.context,R.style.DialogTheme)
 val factory = LayoutInflater.from(OtrosDetailFragment.fragment.context);
 var view = factory.inflate(R.layout.sample, null)
 [...]
 vacationDialog.setView(view)
        val window = vacationDialog.create()
 vacationDialog.setPositiveButton("Cerrar"){dialog, which ->
            dialog.dismiss()

        }

 /**Listener called when the AlertDialog is shown**/


 vacationDialog.show()

 window.setOnShowListener {

 /**Get the positive button from the AlertDialog**/
 val positiveButton = window.getButton(DialogInterface.BUTTON_POSITIVE)

 /**Set your color to the positive button**/
 positiveButton.setBackgroundColor(ContextCompat.getColor(fragment.context!!, R.color.colorPrimary))
 positiveButton.setTextColor(ContextCompat.getColor(fragment.context!!, R.color.colorPrimary))
 positiveButton.setHintTextColor(ContextCompat.getColor(fragment.context!!, R.color.colorPrimary))
 positiveButton.setLinkTextColor(ContextCompat.getColor(fragment.context!!, R.color.colorPrimary))
        }

This is the style DialogTheme defined in styles.xml, in which, by the way, I cannot find a way to change the default button color (black), and seems to override any change tried from code.

<style name="DialogTheme" parent="android:Theme.Holo">

        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <!-- No backgrounds, titles or window float -->
        <item name="android:windowBackground">@color/white</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:gravity">center</item>


    </style>

Any idea on how to approach this issue?

Upvotes: 2

Views: 3794

Answers (3)

Shivam
Shivam

Reputation: 39

  • You can create your custom layout for AlertDialog and inflate it in your custom class extending AlertDialog.
  • Use androidx.appcompat.app.AlertDialog rather than normal android.app.AlertDialog

Upvotes: 1

Gabriele Mariotti
Gabriele Mariotti

Reputation: 363667

If you are using an AppCompat theme you can use something like:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <!-- Used for the buttons -->
        <item name="colorAccent">#FFCC00</item>
        <!-- Used for the title and text -->
        <item name="android:textColorPrimary">#FFFFFF</item>
        <!-- Used for the background -->
        <item name="android:background">#5fa3d0</item>
</style>

enter image description here

With the new Material components for android library you can use the new androidx.appcompat.app.AlertDialog.

Just use something like:

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

You can customize your theme with something like:

  <!-- Alert Dialog -->
  <style name="MyThemeOverlay.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="buttonBarNegativeButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>
  </style>

and:

  <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#FFFFFF</item>
    <item name="backgroundTint">@color/selector_bt</item>
  </style>

enter image description here

Upvotes: 8

Abu Noman
Abu Noman

Reputation: 455

If you use custom layout then you can change anything easily. Follow the code below:

private fun showAlertDialog(activity: Activity){
    val dialog = Dialog(activity)
    dialog.setContentView(R.layout.dialog_layout)
    dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
    dialog.show()
}

Upvotes: 1

Related Questions