Search code examples
androiddialogsettingscolor-schemepreference

Change color of blue line under title view in dialogpreference


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?


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>