How to change theme for AlertDialog

前端 未结 15 1897
名媛妹妹
名媛妹妹 2020-11-22 09:14

I was wondering if someone could help me out. I am trying to create a custom AlertDialog. In order to do this, I added the following line of code in styles.xml



        
相关标签:
15条回答
  • 2020-11-22 09:52

    I was struggling with this - you can style the background of the dialog using android:alertDialogStyle="@style/AlertDialog" in your theme, but it ignores any text settings you have. As @rflexor said above it cannot be done with the SDK prior to Honeycomb (well you could use Reflection).

    My solution, in a nutshell, was to style the background of the dialog using the above, then set a custom title and content view (using layouts that are the same as those in the SDK).

    My wrapper:

    import com.mypackage.R;
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.drawable.Drawable;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class CustomAlertDialogBuilder extends AlertDialog.Builder {
    
        private final Context mContext;
        private TextView mTitle;
        private ImageView mIcon;
        private TextView mMessage;
    
        public CustomAlertDialogBuilder(Context context) {
            super(context);
            mContext = context; 
    
            View customTitle = View.inflate(mContext, R.layout.alert_dialog_title, null);
            mTitle = (TextView) customTitle.findViewById(R.id.alertTitle);
            mIcon = (ImageView) customTitle.findViewById(R.id.icon);
            setCustomTitle(customTitle);
    
            View customMessage = View.inflate(mContext, R.layout.alert_dialog_message, null);
            mMessage = (TextView) customMessage.findViewById(R.id.message);
            setView(customMessage);
        }
    
        @Override
        public CustomAlertDialogBuilder setTitle(int textResId) {
            mTitle.setText(textResId);
            return this;
        }
        @Override
        public CustomAlertDialogBuilder setTitle(CharSequence text) {
            mTitle.setText(text);
            return this;
        }
    
        @Override
        public CustomAlertDialogBuilder setMessage(int textResId) {
            mMessage.setText(textResId);
            return this;
        }
    
        @Override
        public CustomAlertDialogBuilder setMessage(CharSequence text) {
            mMessage.setText(text);
            return this;
        }
    
        @Override
        public CustomAlertDialogBuilder setIcon(int drawableResId) {
            mIcon.setImageResource(drawableResId);
            return this;
        }
    
        @Override
        public CustomAlertDialogBuilder setIcon(Drawable icon) {
            mIcon.setImageDrawable(icon);
            return this;
        }
    
    }
    

    alert_dialog_title.xml (taken from the SDK)

    <?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:layout_marginTop="6dip"
                android:layout_marginBottom="9dip"
                android:layout_marginLeft="10dip"
                android:layout_marginRight="10dip">
    
                <ImageView android:id="@+id/icon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top"
                    android:paddingTop="6dip"
                    android:paddingRight="10dip"
                    android:src="@drawable/ic_dialog_alert" />
                <TextView android:id="@+id/alertTitle"
                    style="@style/?android:attr/textAppearanceLarge"
                    android:singleLine="true"
                    android:ellipsize="end"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content" />
            </LinearLayout>
            <ImageView android:id="@+id/titleDivider"
                android:layout_width="fill_parent"
                android:layout_height="1dip"
                android:scaleType="fitXY"
                android:gravity="fill_horizontal"
                android:src="@drawable/divider_horizontal_bright" />
    </LinearLayout>
    

    alert_dialog_message.xml

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/scrollView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:paddingTop="2dip"
                android:paddingBottom="12dip"
                android:paddingLeft="14dip"
                android:paddingRight="10dip">
        <TextView android:id="@+id/message"
                    style="?android:attr/textAppearanceMedium"
                    android:textColor="@color/dark_grey"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:padding="5dip" />
    </ScrollView>
    

    Then just use CustomAlertDialogBuilder instead of AlertDialog.Builder to create your dialogs, and just call setTitle and setMessage as usual.

    0 讨论(0)
  • 2020-11-22 09:52

    You can directly assign a theme when you initiate the Builder:

    AlertDialog.Builder builder = new AlertDialog.Builder(
                        getActivity(), R.style.MyAlertDialogTheme);
    

    Then customize your theme in your values/styles.xml

    <!-- Alert Dialog -->
    <style name="MyAlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:colorBackground">@color/alertDialogBackground</item>
        <item name="android:windowBackground">@color/alertDialogBackground</item>
    </style>
    
    0 讨论(0)
  • 2020-11-22 09:52
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Title");
    builder.setMessage("Description");
    builder.setPositiveButton("OK", null);
    builder.setNegativeButton("Cancel", null);
    builder.show();
    
    0 讨论(0)
提交回复
热议问题