在对话框首选项中更改标题视图下的蓝线颜色

时间:2013-07-23 15:15:57

标签: android dialog settings color-scheme preference

有没有办法将DialogPreference中标题下的蓝线颜色更改为黄色或橙色?我试过了:

  1. 手动更改AlertDialogs的主题
  2. 使用project: android-styled-dialogs
  3. 对DialogPreference进行子类化,并在customTitleView中添加一个宽度为2dp的橙色drawable onPrepareDialogBuilder(Builder builder)。 (见android Theme.Holo.Dialog changing blue lines to orange
  4. 这些尝试都没有成功。有没有人有过这方面的经验并找到了解决方案?

1 个答案:

答案 0 :(得分:0)

好的,我想通了,但它是一个hacky解决方案。对于DialogPreferences,在showDialog()之前不会调用AlertDialog.Builder方法(请参阅here)。

知道并从here修改解决方案,我们可以摆脱标题 Window.FEATURE_NO_TITLE标志并使用标题和我们自己的水平分隔符built-int来扩展我们自己的XML:

@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));
    }

其中onBindDialogView(View view)只是找到TextViews(标题和消息)并初始化它们。 onPrepareDialogBuilder()只调用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>