Question

Is there a way to change the color of the blue line under the title in a DialogPreference to a color like yellow or orange? I've tried:

  1. Changing the themes for AlertDialogs manually
  2. Using the project: android-styled-dialogs library
  3. Subclassing DialogPreference and adding a customTitleView with an orange drawable that's 2dp wide in onPrepareDialogBuilder(Builder builder). (See android Theme.Holo.Dialog changing blue lines to orange)

None of these attempts have been successful. Has anyone had experience with this and found a solution?

Was it helpful?

Solution

Ok I figured it out, but its a hacky solution. For DialogPreferences, the AlertDialog.Builder methods aren't called until showDialog() (see here).

Knowing that and modifying the solution from here, we can get rid of the title with the Window.FEATURE_NO_TITLE flag and inflate our own XML with a title and our own horizontal divider built-int:

@Override
    protected void showDialog(Bundle state) {
        Context context = getContext();        
        AlertDialog.Builder mBuilder = new AlertDialog.Builder(context);
        View view = LayoutInflater.from(context).inflate(R.layout.pref_dialog_about_title, null);

        onBindDialogView(view);
        mBuilder.setView(view);
        onPrepareDialogBuilder(mBuilder);

//        getPreferenceManager().registerOnActivityDestroyListener();

        // Create the dialog
        final Dialog dialog = mBuilder.create();
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        if (state != null) {
            dialog.onRestoreInstanceState(state);
        }

        dialog.setOnDismissListener(this);
        dialog.show();

        Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL);
        FontChanger.getInstance(getContext()).changeFont(neutralButton);
        neutralButton.setTextColor(mColorOrangeEnabled);
        neutralButton.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.ab_background_gradient_bottom));
    }

where onBindDialogView(View view) simply locates the TextViews (title and message) and initializes them. onPrepareDialogBuilder() just calls setNeutralButton(...).

pref_dialog_about_title.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/title_template"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:background="@drawable/ab_background_gradient_top">
        <TextView 
            android:id="@+id/alertTitle"
            style="?android:attr/textAppearanceLarge"
            android:layout_marginTop="6dip"
            android:layout_marginBottom="9dip"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:singleLine="true"
            android:ellipsize="end"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/border">

            <TextView
                android:id="@+id/author"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"/>
            <TextView
                android:id="@+id/btag"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/author"
                android:layout_centerHorizontal="true"/>

        </RelativeLayout>
</LinearLayout>

ab_background_gradient_top:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Bottom Line -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/orange" />
        </shape>
    </item>

    <!-- Color of your action bar -->
    <item android:bottom="2dip">
        <shape android:shape="rectangle">
            <gradient
            android:angle="90"
            android:centerColor="#3b0808"
            android:endColor="#570b0b"
            android:startColor="#1d0404"
            android:type="linear" />

            <corners 
                android:radius="0dp"/>
        </shape>
    </item>
</layer-list>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top