如何在android中创建自定义对话框?

How to create a Custom Dialog box in android?

我想创建一个自定义对话框,如下所示

enter image description here

我尝试过以下的事情。

  • 我创建了AlertDialog.Builder的子类,并使用了自定义标题和自定义内容视图并使用了它,但结果并不像预期的那样。

  • 另一种尝试是继承DialogFragment并在onCreateDialog中自定义对话框,但结果不是预期的。

  • 然后我尝试使用普通的Dialog类。结果并不像预期的那样。

  • 在所有三种情况下,问题是当我忽略标题视图时,对话框的大小不是预期的,当我使用标题视图时,结果是内容视图周围有一个粗边框(实际上看起来很糟糕)。现在我脑子里有两个问题......

  • 我怎样才能做到这一点?由于我已经尝试了很多东西,因此我们将更加赞赏直接的答案。

  • 在Android应用程序中显示错误或警告对话框的最佳方法是什么?

  • 编辑
    Android Developer Documentation建议我们使用DialogFragments或Dialogs向用户显示错误/警报消息。但有一次他们说......

    Tip: If you want a custom dialog, you can instead display an Activity as a dialog instead of using the Dialog APIs. Simply create an activity and set its theme to Theme.Holo.Dialog in the manifest element.

    那是什么意思?使用Activity只是为了显示错误消息是不是太多了?


    在这里,我创建了一个简单的Dialog,如:

    Dialog Box

    custom_dialog.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?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="80dp"
        android:background="#3E80B4"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_dia"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:text="Do you realy want to exit ?"
            android:textColor="@android:color/white"
            android:textSize="15dp"
            android:textStyle="bold"/>


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="#3E80B4"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn_yes"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:background="@android:color/white"
                android:clickable="true"
                android:text="Yes"
                android:textColor="#5DBCD2"
                android:textStyle="bold" />

            <Button
                android:id="@+id/btn_no"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_marginLeft="5dp"
                android:background="@android:color/white"
                android:clickable="true"
                android:text="No"
                android:textColor="#5DBCD2"
                android:textStyle="bold" />
        </LinearLayout>

    </LinearLayout>

    你必须extends Dialogimplements OnClickListener

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class CustomDialogClass extends Dialog implements
        android.view.View.OnClickListener {

      public Activity c;
      public Dialog d;
      public Button yes, no;

      public CustomDialogClass(Activity a) {
        super(a);
        // TODO Auto-generated constructor stub
        this.c = a;
      }

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.custom_dialog);
        yes = (Button) findViewById(R.id.btn_yes);
        no = (Button) findViewById(R.id.btn_no);
        yes.setOnClickListener(this);
        no.setOnClickListener(this);

      }

      @Override
      public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_yes:
          c.finish();
          break;
        case R.id.btn_no:
          dismiss();
          break;
        default:
          break;
        }
        dismiss();
      }
    }

    如何拨打电话?

    1
    2
    3
    R.id.TXT_Exit:
    CustomDialogClass cdd=new CustomDialogClass(Values.this);
    cdd.show();

    更新

    很长一段时间后,我的一个朋友让我做了一个透明背景的弯曲形状对话框。所以,我在这里实现了它。

    enter image description here

    要制作弯曲的形状,您需要创建一个单独的curve_shap.XML,如下所示,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <shape xmlns:android="http://schemas.android.com/apk/res/android">

        <solid android:color="#000000" />

        <stroke
            android:width="2dp"
            android:color="#ffffff" />

        <corners
            android:bottomLeftRadius="20dp"
            android:bottomRightRadius="20dp"
            android:topLeftRadius="20dp"
            android:topRightRadius="20dp" />

    </shape>

    现在,在主视图布局中添加此curve_shap.XML。在我的情况下,我使用LinearLayout

    1
    2
    3
    4
    5
    6
    7
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="80dp"
            android:background="@drawable/curve_shap"
            android:orientation="vertical">
    ...
    </LinearLayout>

    怎么称呼这个?

    1
    2
    3
    CustomDialogClass cdd = new CustomDialogClass(MainActivity.this);
    cdd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    cdd.show();

    我希望这对你有用。


    这是一个示例对话框,使用xml创建。

    enter image description here

    下一个代码xml只是一个例子,设计或视图在这里实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffffff">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:id="@+id/a"
        android:gravity="center"
        android:background="#DA5F6A"
        android:src="@drawable/dialog_cross"
        android:scaleType="fitCenter" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEXTO"
        android:id="@+id/text_dialog"
        android:layout_below="@+id/a"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="20dp"
        android:textSize="18sp"
        android:textColor="#ff000000"
        android:layout_centerHorizontal="true"
        android:gravity="center_horizontal" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:text="OK"
        android:id="@+id/btn_dialog"
        android:gravity="center_vertical|center_horizontal"
        android:layout_below="@+id/text_dialog"
        android:layout_marginBottom="20dp"
        android:background="@drawable/btn_flat_red_selector"
        android:layout_centerHorizontal="true"
        android:textColor="#ffffffff" />

    </RelativeLayout>

    这行代码是drawable的资源:

    1
    2
    android:src="@drawable/dialog_cross"
    android:background="@drawable/btn_flat_red_selector"

    你可以做一个类扩展Dialog,也是这样的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class ViewDialog {

        public void showDialog(Activity activity, String msg){
            final Dialog dialog = new Dialog(activity);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setCancelable(false);
            dialog.setContentView(R.layout.dialog);

            TextView text = (TextView) dialog.findViewById(R.id.text_dialog);
            text.setText(msg);

            Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
            dialogButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });

            dialog.show();

        }
    }

    最后是你的Activity上的调用形式,例如:

    1
    2
    ViewDialog alert = new ViewDialog();
    alert.showDialog(getActivity(),"Error de conexión al servidor");

    我希望它为你工作。


    另一种简单的方法。

    步骤1)创建一个具有正确id的布局。

    步骤2)在任何您想要的地方使用以下代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    LayoutInflater factory = LayoutInflater.from(this);
    final View deleteDialogView = factory.inflate(R.layout.mylayout, null);
    final AlertDialog deleteDialog = new AlertDialog.Builder(this).create();
    deleteDialog.setView(deleteDialogView);
    deleteDialogView.findViewById(R.id.yes).setOnClickListener(new OnClickListener() {    
        @Override
        public void onClick(View v) {
            //your business logic
            deleteDialog.dismiss();
        }
    });
    deleteDialogView.findViewById(R.id.no).setOnClickListener(new OnClickListener() {    
        @Override
        public void onClick(View v) {
            deleteDialog.dismiss();    
        }
    });

    deleteDialog.show();


    values -> style.xml中添加以下主题

    1
    2
    3
    4
    <style name="Theme_Dialog" parent="android:Theme.Light">
         <item name="android:windowNoTitle">true</item>
         <item name="android:windowBackground">@android:color/transparent</item>
    </style>

    onCreateDialog方法中使用此主题,如下所示:

    1
    Dialog dialog = new Dialog(FlightBookActivity.this,R.style.Theme_Dialog);

    在xml文件中定义包含标题栏的对话框布局,并将xml文件设置为:

    1
    dialog.setContentView(R.layout.your_dialog_layout);


    简单首先创建一个类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     public class ViewDialog {

            public void showDialog(Activity activity, String msg){
                final Dialog dialog = new Dialog(activity);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setCancelable(false);
                dialog.setContentView(R.layout.custom_dialogbox_otp);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

                TextView text = (TextView) dialog.findViewById(R.id.txt_file_path);
                text.setText(msg);

                Button dialogBtn_cancel = (Button) dialog.findViewById(R.id.btn_cancel);
                dialogBtn_cancel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
    //                    Toast.makeText(getApplicationContext(),"Cancel" ,Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                });

                Button dialogBtn_okay = (Button) dialog.findViewById(R.id.btn_okay);
                dialogBtn_okay.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
    //                    Toast.makeText(getApplicationContext(),"Okay" ,Toast.LENGTH_SHORT).show();
                        dialog.cancel();
                    }
                });

                dialog.show();
            }
        }

    然后创建custom_dialogbox_otp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="330dp"
        android:layout_height="160dp"
        android:background="#00555555"
        android:orientation="vertical"
        android:padding="5dp"
        android:weightSum="100">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/round_layout_otp"
            android:orientation="vertical"
            android:padding="7dp"
            android:weightSum="100">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="60"
                android:orientation="horizontal"
                android:weightSum="100">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="80"
                    android:gravity="center">

                    <ImageView
                        android:id="@+id/a"
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:background="#DA5F6A"
                        android:gravity="center"
                        android:scaleType="fitCenter"
                        android:src="@mipmap/infoonetwo" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="20">

                    <TextView
                        android:id="@+id/txt_file_path"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:singleLine="true"
                        android:text="TEXTO"
                        android:textColor="#FFFFFF"
                        android:textSize="17sp"
                        android:textStyle="bold" />
                </LinearLayout>
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="40"
                android:background="@drawable/round_layout_white_otp"
                android:orientation="vertical"
                android:weightSum="100">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:layout_weight="60">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="Do you wanna Exit..?"
                        android:textColor="#ff000000"
                        android:textSize="15dp"
                        android:textStyle="bold" />
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="40"
                    android:orientation="horizontal"
                    android:weightSum="100">


                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginRight="30dp"
                        android:layout_weight="50"
                        android:gravity="center|right">

                        <Button
                            android:id="@+id/btn_cancel"
                            android:layout_width="80dp"
                            android:layout_height="25dp"
                            android:background="@drawable/round_button"
                            android:gravity="center"
                            android:text="CANCEL"
                            android:textSize="13dp"
                            android:textStyle="bold"
                            android:textColor="#ffffffff" />

                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="30dp"
                        android:layout_weight="50"
                        android:gravity="center|left">


                        <Button
                            android:id="@+id/btn_okay"
                            android:layout_width="80dp"
                            android:layout_height="25dp"
                            android:background="@drawable/round_button"
                            android:text="OKAY"
                            android:textSize="13dp"
                            android:textStyle="bold"
                            android:textColor="#ffffffff" />

                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    然后在你的drawable创建xml文件下面。
    对于round_layout_white_otp.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <!-- <corners android:radius="10dp" /> -->
        <corners
            android:bottomLeftRadius="18dp"
            android:bottomRightRadius="16dp"
            android:topLeftRadius="38dp"
            android:topRightRadius="36dp" />
        <solid android:color="#C0C0C0" />
        </shape>

    对于round_layout_otp.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <!-- <corners android:radius="10dp" /> -->
        <corners
            android:bottomLeftRadius="18dp"
            android:bottomRightRadius="16dp"
            android:topLeftRadius="38dp"
            android:topRightRadius="38dp" />
        <solid android:color="#DA5F6A" />
        </shape>

    round_button

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <!-- <corners android:radius="10dp" /> -->
        <corners
            android:bottomLeftRadius="7dp"
            android:bottomRightRadius="7dp"
            android:topLeftRadius="7dp"
            android:topRightRadius="7dp" />
        <solid android:color="#06A19E" />
        </shape>

    然后最后使用下面的代码来视觉对话:)

    1
    2
    ViewDialog alert = new ViewDialog();
            alert.showDialog(ReceivingOTPRegActivity.this,"OTP has been sent to your Mail");

    你的输出:)

    enter image description here


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public static void showCustomAlertDialog(Context context, String name,
                String id, String desc, String fromDate, String toDate,
                String resions) {
            final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.dialog, null);
            alertDialogBuilder.setView(view);
            alertDialogBuilder.setCancelable(false);
            final AlertDialog dialog = alertDialogBuilder.create();
            dialog.show();
            txt_empId = (TextView) view.findViewById(R.id.txt_dialog_empcode);
            txt_empName = (TextView) view.findViewById(R.id.txt_dialog_empname);
            txt_desc = (TextView) view.findViewById(R.id.txt_dialog_desc);
            txt_startDate = (TextView) view.findViewById(R.id.txt_dialog_startDate);
            txt_resions = (TextView) view.findViewById(R.id.txt_dialog_endDate);
            txt_empId.setTypeface(Utils.setLightTypeface(context));
            txt_empName.setTypeface(Utils.setLightTypeface(context));
            txt_desc.setTypeface(Utils.setLightTypeface(context));
            txt_startDate.setTypeface(Utils.setLightTypeface(context));
            txt_resions.setTypeface(Utils.setLightTypeface(context));

            txt_empId.setText(id);
            txt_empName.setText(name);

            txt_desc.setText(desc);
            txt_startDate.setText(fromDate +"\t to \t" + toDate);
            txt_resions.setText(resions);



            btn_accept = (Button) view.findViewById(R.id.btn_dialog_accept);
            btn_reject = (Button) view.findViewById(R.id.btn_dialog_reject);
            btn_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel);
            btn_accept.setTypeface(Utils.setBoldTypeface(context));
            btn_reject.setTypeface(Utils.setBoldTypeface(context));
            btn_cancel.setTypeface(Utils.setBoldTypeface(context));

            btn_cancel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();

                }
            });

        }


    创建自定义对话框的最简单方法:

  • 初始化并显示对话框:

    1
    2
     ViewDialog alertDialoge = new ViewDialog();
     alertDialoge.showDialog(getActivity(),"PUT DIALOG TITLE");
  • 创建方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class ViewDialog {

      public void showDialog(Activity activity, String msg) {

        final Dialog dialog = new Dialog(activity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.custom_dialoge_feedback);

        TextView text = (TextView) dialog.findViewById(R.id.text_dialog_feedback);
        text.setText(msg);

        Button okButton = (Button) dialog.findViewById(R.id.btn_dialog_feedback);
        Button cancleButton = (Button) dialog.findViewById(R.id.btn_dialog_cancle_feedback);
        final EditText edittext_tv = (EditText) dialog.findViewById(R.id.dialoge_alert_text_feedback);

        okButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //Perfome Action
            }
        });
        cancleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });

        dialog.show();

        }
    }
  • 创建您想要或需要的布局XML。


  • 我发现这是显示自定义对话框的最简单方法。

    你有布局your_layout.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void showCustomDialog(final Context context) {
        Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.your_layout, null, false);
        findByIds(view);  /*HERE YOU CAN FIND YOU IDS AND SET TEXTS OR BUTTONS*/
        ((Activity) context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        dialog.setContentView(view);
        final Window window = dialog.getWindow();
        window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
        window.setBackgroundDrawableResource(R.color.colorTransparent);
        window.setGravity(Gravity.CENTER);
        dialog.show();
    }

    您可以尝试这个简单的android对话框弹出库来剪切混乱的对话框代码。在您的活动中使用非常简单。
    之后,您可以在活动中显示此代码以显示对话框

    1
    Pop.on(this).with().title(R.string.title).layout(R.layout.custom_pop).show();

    其中R.layout.custom_pop是您想要装饰对话框的自定义布局。


    创建自定义警报布局custom_aler_update.xml

    然后将此代码复制到Activity:

    1
    2
    3
    4
    5
    6
    7
    8
    9
            AlertDialog basic_reg;
        AlertDialog.Builder builder ;
        builder = new AlertDialog.Builder(ct, R.style.AppCompatAlertDialogStyle);
        LayoutInflater inflater = ((Activity) ct).getLayoutInflater();
        View v = inflater.inflate(R.layout.custom_aler_update, null);
        builder.setView(v);
        builder.setCancelable(false);
        builder.create();
        basic_reg = builder.show();

    将此代码复制到样式:

    1
    2
    3
    4
    5
      <style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/primaryTextColor</item>
        <item name="android:background">@color/white</item>
    </style>

    更改背景颜色和文本样式的最简单方法是为Android警报对话框创建自定义主题,如下所示: -

    :只需将下面的代码放到styles.xml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        <style name="AlertDialogCustom" parent="@android:style/Theme.Dialog">
        <item name="android:textColor">#999999</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowTitleStyle">@null</item>
        <item name="android:typeface">monospace</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:textSize">@dimen/abc_text_size_medium_material</item>
        <item name="android:background">#80ff00ff</item>
    </style>

    :现在自定义事情已经完成,现在只适用于您的alertBuilder对象:

    1
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,R.style.AlertDialogCustom);

    希望对你有帮助 !


    enter image description here

    上面的截图是我的结果。

    脚步 :

  • 需要创建xml。 //你设计
  • 需要写方法。 //定义访问方法
  • 随时随地打电话。 //访问回调
  • 请参考给定的链接以获取代码参考CustomDialogBox。


    创建警报对话框布局是这样的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:text="Custom Alert Dialog"
            android:layout_height="40dp">
        </Button>
    </LinearLayout>

    并在Activity类上添加以下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LayoutInflater inflate = LayoutInflater.from(this);
        alertView = inflate.inflate(R.layout.your_alert_layout, null);
        Button btn= (Button) alertView.findViewById(R.id.btn);

        showDialog();
      }

     public void showDialog(){
            Dialog alertDialog = new Dialog(RecognizeConceptsActivity.this);
            alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            alertDialog.setContentView(alertView);
            alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            alertDialog.show();
        }

    它是Alert Dialog的一个类,因此您可以从任何活动调用该类来重用代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public class MessageOkFragmentDialog extends DialogFragment {
    Typeface Lato;
    String message ="";
    String title ="";
    int messageID = 0;

    public MessageOkFragmentDialog(String message, String title) {
        this.message = message;
        this.title = title;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        LayoutInflater inflater = getActivity().getLayoutInflater();

        View convertview = inflater.inflate(R.layout.dialog_message_ok_box, null);


        Constants.overrideFonts(getActivity(), convertview);
        Lato = Typeface
                .createFromAsset(getActivity().getAssets(),"font/Lato-Regular.ttf");


        TextView textmessage = (TextView) convertview
                .findViewById(R.id.textView_dialog);

        TextView textview_dialog_title = (TextView) convertview.findViewById(R.id.textview_dialog_title);

        textmessage.setTypeface(Lato);
        textview_dialog_title.setTypeface(Lato);



        textmessage.setText(message);
        textview_dialog_title.setText(title);



        Button button_ok = (Button) convertview
                .findViewById(R.id.button_dialog);
        button_ok.setTypeface(Lato);

        builder.setView(convertview);
        button_ok.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                dismiss();

            }
        });


        return builder.create();

    }
    }

    同样的Xml文件是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
        <?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="match_parent"
        android:background="#ffffff"
        android:gravity="center_vertical|center"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/blue_color"
                android:gravity="center_horizontal"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/textview_dialog_title"
                    android:layout_width="wrap_content"
                    android:layout_height="50dp"
                    android:gravity="center"
                    android:textColor="@color/white_color"
                    android:textSize="@dimen/txtSize_Medium" />


            </LinearLayout>

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/txt_white_color" />

            <TextView
                android:id="@+id/textView_dialog"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_margin="@dimen/margin_20"
                android:textColor="@color/txt_gray_color"
                android:textSize="@dimen/txtSize_small" />

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/txt_white_color"
                android:visibility="gone"/>

            <Button
                android:id="@+id/button_dialog"
                android:layout_width="wrap_content"
                android:layout_height="@dimen/margin_40"
                android:layout_gravity="center"
                android:background="@drawable/circular_blue_button"

                android:text="@string/ok"
                android:layout_marginTop="5dp"
                android:layout_marginBottom="@dimen/margin_10"
                android:textColor="@color/txt_white_color"
                android:textSize="@dimen/txtSize_small" />
        </LinearLayout>

    </LinearLayout>

    Dialog Fragment是创建自定义Alert Dialog的最简单方法。按照上面的代码为对话框创建自定义视图,然后使用Dialog Fragment实现它。将以下代码添加到布局文件中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     <?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="80dp"
        android:background="#3E80B4"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_dia"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:text="Do you realy want to exit ?"
            android:textColor="@android:color/white"
            android:textSize="15dp"
            android:textStyle="bold" />


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="#3E80B4"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn_yes"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:background="@android:color/white"
                android:clickable="true"
                android:text="Yes"
                android:textColor="#5DBCD2"
                android:textStyle="bold" />

            <Button
                android:id="@+id/btn_no"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_marginLeft="5dp"
                android:background="@android:color/white"
                android:clickable="true"
                android:text="No"
                android:textColor="#5DBCD2"
                android:textStyle="bold" />
        </LinearLayout>

    </LinearLayout>

    创建自定义警报对话框

    cumstomDialog.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <ImageView
        android:id="@+id/icon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        app:srcCompat="@drawable/error" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:fontFamily="@font/muli_bold"
        android:text="Title"
        android:layout_marginTop="5dp"
        android:textColor="@android:color/black"
        android:textSize="15sp" />


    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:fontFamily="@font/muli_regular"
        android:text="Message"
        android:textColor="@android:color/black"
        android:textSize="12dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:orientation="horizontal">

        <Button
            android:id="@+id/cancelBTN"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_margin="5dp"
            android:background="@drawable/bground_radius_button_white"
            android:text="No"
            android:textColor="@color/black" />

        <Button
            android:id="@+id/acceptBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_margin="5dp"
            android:background="@drawable/bground_radius_button"
            android:text="Yes"
            android:textColor="@color/white" />
    </LinearLayout>

    在您的活动中显示自定义对话框:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
      public void showDialog(String title, String des, int icon) {

        final Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.custom_dialog);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

        Button cancelBTN = dialog.findViewById(R.id.cancelBTN);
        Button acceptBTN = dialog.findViewById(R.id.acceptBtn);
        TextView tvTitle = dialog.findViewById(R.id.title);
        TextView tvDescription = dialog.findViewById(R.id.description);
        ImageView ivIcon = dialog.findViewById(R.id.icon);

        tvTitle.setText(title);
        tvDescription.setText(des);
        ivIcon.setImageResource(icon);

        cancelBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        acceptBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        dialog.show();
    }

    像这样打电话:

    showDialog("Title","Message",R.drawable.warning);


    我喜欢使用tcAron库。
    (点击此处下载:https://github.com/triocoder/tcAron)

  • 进口类:

    import com.triocoder.tcaron.tcaronlibrary.tcAronDialogs;

  • 写这个:

    tcAronDialogs.showFancyAlert(MainActivity.this,false,"Text","Close","ic_hub_white",0xFFF44336);

  • 检查文档:
    https://github.com/triocoder/tcAron/wiki/showFancyAlert


  • 我发布了我正在使用的kotlin代码,它对我来说很好。您还可以为对话框按钮设置单击侦听器。

    这是我的XML代码:

    layout_custom_alert_dialog.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layoutDirection="ltr"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:id="@+id/view6"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:background="@color/colorPrimary" />

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/view6"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp">


            <TextView
                android:id="@+id/txt_alert_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                tools:text="are you sure?"
                android:textAlignment="center"
                android:textColor="@android:color/black"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />


            <Button
                android:id="@+id/btn_alert_positive"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textView2"
                android:layout_marginTop="8dp"
                android:background="@android:color/transparent"
                tools:text="yes"
                android:textColor="@color/colorPrimaryDark"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toEndOf="@+id/btn_alert_negative"
                app:layout_constraintTop_toBottomOf="@+id/txt_alert_title" />

            <Button
                android:id="@+id/btn_alert_negative"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:background="@android:color/transparent"
                tools:text="no"
                android:textColor="@color/colorPrimaryDark"
                app:layout_constraintEnd_toStartOf="@+id/btn_alert_positive"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/txt_alert_title" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </RelativeLayout>

    mAlertDialog.kt

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    class mAlertDialog(context: Context) {

        private val btn_positive : Button
        private val btn_negative : Button
        private val txt_alert_title : TextView
        private val dialog : AlertDialog
        init {
            val view = LayoutInflater.from(context).inflate(R.layout.layout_custom_alert_dialog,null)

            val dialog_builder = AlertDialog.Builder(context)
            dialog_builder.setView(view)

            btn_negative = view.findViewById(R.id.btn_alert_negative)
            btn_positive = view.findViewById(R.id.btn_alert_positive)
            txt_alert_title = view.findViewById(R.id.txt_alert_title)

            dialog = dialog_builder.create()
        }

        fun show()
        {
            dialog.show()
        }

        fun setPositiveClickListener(listener :onClickListener)
        {
            btn_positive.setOnClickListener { v ->
                listener.onClick(btn_positive)
                dialog.dismiss()
            }
        }

        fun setNegativeClickListener(listener: onClickListener)
        {
            btn_negative.setOnClickListener { v ->
                listener.onClick(btn_negative)
                dialog.dismiss()
            }
        }

        fun setPoitiveButtonText(text : String)
        {
            btn_positive.text = text
        }


        fun setNegativeButtonText(text : String)
        {
            btn_negative.text = text
        }

        fun setAlertTitle(title : String)
        {
            txt_alert_title.text = title
        }
    }

    点击侦听器的界面:

    onClickListener.kt

    1
    2
    3
    interface onClickListener{
        fun onClick(view : View)
    }

    样本用法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    val dialog = mAlertDialog(context)
                    dialog.setNegativeButtonText("no i dont")
                    dialog.setPoitiveButtonText("yes is do")
                    dialog.setAlertTitle("do you like this alert dialog?")

                    dialog.setPositiveClickListener(object : onClickListener {
                        override fun onClick(view: View) {
                            Toast.makeText(context,"yes", Toast.LENGTH_SHORT).show()
                        }
                    })

                    dialog.setNegativeClickListener(object : onClickListener {
                        override fun onClick(view: View) {
                            Toast.makeText(context,"no", Toast.LENGTH_SHORT).show()
                        }
                    })

                    dialog.show()

    我希望这能帮到您!


    导入自定义提醒:

    1
    2
    3
    4
    5
    6
    7
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.dse_location_list_filter, null);
            final Dialog dialog = new Dialog(Acitvity_name.this);
            dialog.setContentView(view);
            dialog.setCancelable(true);
            dialog.setCanceledOnTouchOutside(true);
            dialog.show();