Rakesh
Rakesh

Reputation: 4127

Custom theme for AlertDialog not working

I am trying to customize the accent color for AlertDialog buttons. But it is not taking any affect it seems it is inheriting the color from system. Here is my style/theme.

   <color name="actionable_items">#0574ac</color>  <!-- it is blue color --> 
   <style name="LLDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
      <!--buttons color-->
      <item name="colorAccent">@color/actionable_items</item>
      <!--item RadioButton or CheckBox color-->
      <item name="colorControlActivated">@color/actionable_items</item>
      <item name="colorPrimary">@color/actionable_items</item>
      <item name="colorPrimaryDark">@color/actionable_items</item>
      <item name="android:listChoiceIndicatorMultiple">@color/actionable_items</item>
      <item name="android:listChoiceIndicatorSingle">@color/actionable_items</item>
   </style>

Here is my code which is trying to build the Alertdialog.

final CustomPopupBuilder removePlaceDialog =  new CustomPopupBuilder(new ContextThemeWrapper(context,
                                                            R.style.LLDialog));
            removePlaceDialog.setTitle(getString(R.string.delete_place, placeName));
            removePlaceDialog.setMessage(getString(R.string.delete_place_message));
            removePlaceDialog.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {

               public void onClick(DialogInterface dialog, int which) {
                  ....
                  ....
               }
            });
            removePlaceDialog.setNegativeButton(R.string.cancel, null);
            removePlaceDialog.create().show();

The final AlertDialog doesn't have buttons with the same text color. The text color is similar to green. It seems like it is inheriting the color from the system instead of the customized theme. Here is the image :enter image description here

EDIT1:

I tried the use the AlertDialog.Builder but it gives me the same result.

final AlertDialog.Builder removePlaceDialog =  AlertDialog.Builder(new ContextThemeWrapper(context,
                                                             R.style.LLDialog));
                removePlaceDialog.setTitle(getString(R.string.delete_place, placeName));
                removePlaceDialog.setMessage(getString(R.string.delete_place_message));
                removePlaceDialog.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {

                   public void onClick(DialogInterface dialog, int which) {
                      ....
                      ....
                   }
                });
                removePlaceDialog.setNegativeButton(R.string.cancel, null);
                removePlaceDialog.create().show();

Edit2:

I also tried to change the accent color for the dialog box but I don't see that color:

<style name="LLDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
      <!--buttons color-->
      <item name="colorAccent">#990000</item>
      ...
      ...
</style>

Even this doesn't change the button text color :(.

Upvotes: 4

Views: 15474

Answers (6)

M A F
M A F

Reputation: 301

I was able to solve this in my use-case by making the parent of the style for the alert dialog the same as the parent for my main style.

Upvotes: 0

Andrei Vinogradov
Andrei Vinogradov

Reputation: 1935

Please check your AlertDialog import. It should be imported from v7 support lib for styles to be applied on older Android versions. I had the same problem and changing import line from

import android.app.AlertDialog

to

import android.support.v7.app.AlertDialog

helped me.

2019 Update:

Cause of google released AndroidX libraries, the new answer would be

import androidx.appcompat.app.AlertDialog;

Thx to @ChristosThemelis

Upvotes: 19

android
android

Reputation: 3090

Create a new style like this below:

<style name="AlertDialogCustom" parent="@android:style/Theme.Holo.Light.Dialog">        
  <!--buttons color-->
  <item name="colorAccent">@color/actionable_items</item>
  <!--item RadioButton or CheckBox color-->
  <item name="colorControlActivated">@color/actionable_items</item>
  <item name="colorPrimary">@color/actionable_items</item>
  <item name="colorPrimaryDark">@color/actionable_items</item>
  <item name="android:listChoiceIndicatorMultiple">@color/actionable_items</item>
  <item name="android:listChoiceIndicatorSingle">@color/actionable_items</item>
</style>

And then in your class:

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.AlertDialogCustom));    
AlertDialog alertDialog = dialogBuilder.create();    
alertDialog.show();

Upvotes: 2

Umesh Sonawane
Umesh Sonawane

Reputation: 527

Here an example hope it will help you

public class CustomDialogUI {
    Dialog dialog;
    Vibrator vib;
    RelativeLayout rl;

    @SuppressWarnings("static-access")
    public void dialog(final Context context, String title, String message,
            final Runnable task) {
        dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom);
        dialog.setCancelable(false);
        TextView m = (TextView) dialog.findViewById(R.id.message);
        TextView t = (TextView) dialog.findViewById(R.id.title);
        final Button n = (Button) dialog.findViewById(R.id.button2);
        final Button p = (Button) dialog.findViewById(R.id.next_button);
        rl = (RelativeLayout) dialog.findViewById(R.id.rlmain);
        t.setText(bold(title));
        m.setText(message);
        dialog.show();
        n.setText(bold("Close"));
        p.setText(bold("Ok"));
        // color(context,rl);
        vib = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
        n.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                vib.vibrate(15);
                dialog.dismiss();
            }
        });
        p.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                vib.vibrate(20);
                dialog.dismiss();
                task.run();
            }
        });
    }
     //customize text style bold italic....
    public SpannableString bold(String s) {
        SpannableString spanString = new SpannableString(s);
        spanString.setSpan(new StyleSpan(Typeface.BOLD), 0,
                spanString.length(), 0);
        spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
        // spanString.setSpan(new StyleSpan(Typeface.ITALIC), 0,
        // spanString.length(), 0);
        return spanString;
    }

    }

XML layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000"
>

<RelativeLayout
    android:id="@+id/rlmain"
    android:layout_width="fill_parent"
    android:layout_height="150dip"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:background="#569CE3" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="25dip"
        android:layout_marginTop="10dip" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="Are you Sure?"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#ffffff"
            android:textSize="13dip" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/relativeLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/relativeLayout1"
        android:layout_alignRight="@+id/relativeLayout1"
        android:layout_below="@+id/relativeLayout1"
        android:layout_marginTop="5dip" >
    </RelativeLayout>

    <ProgressBar
        android:id="@+id/process"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="3dip"
        android:layout_marginTop="3dip" />

    <RelativeLayout
        android:id="@+id/relativeLayout3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/relativeLayout2"
        android:layout_below="@+id/relativeLayout2"
        android:layout_toLeftOf="@+id/process" >

        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#ffffff"
            android:textSize="13dip"/>

    </RelativeLayout>

    <Button
        android:id="@+id/next_button"
        android:layout_width="90dip"
        android:layout_height="35dip"
        android:layout_alignParentBottom="true"
        android:textColor="@drawable/button_text_color"
         android:background="@drawable/blue_button"
         android:layout_marginBottom="5dp"
           android:textSize="10dp"

        android:layout_alignRight="@+id/relativeLayout3"
        android:text="Okay" />

    <Button
        android:id="@+id/button2"
        android:text="Cancel"
        android:textColor="@drawable/button_text_color"
        android:layout_width="90dip"
        android:layout_height="35dip"
        android:layout_marginBottom="5dp"
         android:background="@drawable/blue_button"
         android:layout_marginRight="7dp"
        android:textSize="10dp"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@+id/next_button"
         />

</RelativeLayout>

Upvotes: 0

Micha F.
Micha F.

Reputation: 634

I had the same problem and this is how I solved it:

In styles.xml, declare your Theme and set the attribute android:alertDialogTheme:

<style name="YourTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- your theme attributes here -->
    <item name="android:alertDialogTheme">@style/YourDialogTheme</item>
</style>

<style name="YourDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert" >
    <!-- your dialog-theme attributes here -->
</style>

Now, if you show an AlertDialog like so...

AlertDialog.Builder builder = new AlertDialog.Builder(activity); //where activity is an Activity with the theme attribute set to android:theme="@style/YourTheme" (in AndroidManifest)
//...
builder.show();

...the dialog should have the accentColor and everything set to what you specified in @style/YourDialogTheme

Upvotes: 3

Vishal Thareja
Vishal Thareja

Reputation: 128

If your theme not reflecting your AlertDialog buttons color, you can manage it programmatically also, that could be useful .

    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AppCompatAlertDialogStyle));
    builder.setCancelable(false);

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    String message ="message";
    builder.setTitle("title");

    builder.setMessage(message);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    //   builder.setNegativeButton("No, Thanks", null);
    //builder.show();
    AlertDialog alert = builder.create();
    alert.show();
    Button pbutton = alert.getButton(DialogInterface.BUTTON_POSITIVE);
    pbutton.setTextColor(getResources().getColor(R.color.colorAccent));
    Button nbutton = alert.getButton(DialogInterface.BUTTON_NEGATIVE);
    nbutton.setTextColor(getResources().getColor(R.color.accent));

Here you can change color of both buttons if you required, hope it might userful for you

Upvotes: 0

Related Questions