好的,我想通了,但它是一个 hacky 解决方案。对于 DialogPreferences,直到 showDialog() 才调用 AlertDialog.Builder 方法(请参见此处)。
知道这一点并从这里修改解决方案,我们可以使用 Window.FEATURE_NO_TITLE 标志摆脱标题,并使用标题和我们自己的内置水平分隔线来膨胀我们自己的 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>