Android 自定义Dialog对话框

Android 提供了 AlertDialog 类可通过其内部类 Builder 轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改 AlertDialog 窗口显示的外观,解决的办法就是创建一个指定的 AlertDialog 和 AlertDialog.Builder 类。

Android default Dialog

定义外观

我们希望将上面默认的对话框外观修改为如下图所示的新对话框风格:

Custom Android Dialog

该对话框将支持下面特性:

  1. 可从资源或者字符串直接指定对话框标题
  2. 可从资源、字符串和自定义布局来设置对话框内容
  3. 可设置按钮和相应的事件处理

 编写布局、样式和主题

该对话框使用一个定制的布局来输出内容,布局定义的id将用于访问标题 TextView,下面是定义文件:

<xml version="1.0" encoding="utf-8"?>

 

inearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:minWidth="280dip"

  android:layout_height="wrap_content">

 

 

  <LinearLayout

      android:orientation="vertical"

      android:background="@drawable/header"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content">

 

      <TextView

          style="@style/DialogText.Title"

 

          android:id="@+id/title"

          android:paddingRight="8dip"

          android:paddingLeft="8dip"

          android:background="@drawable/title"

          android:layout_width="wrap_content"

 

          android:layout_height="wrap_content"/>

 

  </LinearLayout>

 

  <LinearLayout

      android:id="@+id/content"

      android:orientation="vertical"

      android:background="@drawable/center"

 

      android:layout_width="fill_parent"

      android:layout_height="wrap_content">

 

      <TextView

          style="@style/DialogText"

          android:id="@+id/message"

          android:padding="5dip"

 

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"/>

 

  </LinearLayout>

 

  <LinearLayout

      android:orientation="horizontal"

      android:background="@drawable/footer"

 

      android:layout_width="fill_parent"

      android:layout_height="wrap_content">

 

      <Button

          android:id="@+id/positiveButton"

          android:layout_marginTop="3dip"

          android:layout_width="0dip"

 

          android:layout_weight="1"

          android:layout_height="wrap_content"

          android:singleLine="true"/>

 

      <Button

          android:id="@+id/negativeButton"

 

          android:layout_marginTop="3dip"

          android:layout_width="0dip"

          android:layout_weight="1"

          android:layout_height="wrap_content"

          android:singleLine="true"/>

 

 

  </LinearLayout>

 

</LinearLayout>

根节点 LinearLayout 的宽度设置为 fill_parent 而最小的宽度是 280dip ,因此对话框的宽度将始终为屏幕宽度的 87.5%

自定义的主题用于声明对话框是浮动的,而且使用自定义的背景和标题视图:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Dialog" parent="android:style/Theme.Dialog">
      <item name="android:windowBackground">@null</item>
      <item name="android:windowNoTitle">true</item>
      <item name="android:windowIsFloating">true</item>
  </style>
</resources>

接下来我们需要定义对话框的标题和消息的显示:

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <style name="DialogText">

      <item name="android:textColor">#FF000000</item>

      <item name="android:textSize">12sp</item>

  </style>

  <style name="DialogText.Title">

      <item name="android:textSize">16sp</item>

      <item name="android:textStyle">bold</item>

  </style>

</resources>

编写对话框和 Builder 类

最好我们要提供跟 AletDialog.Builder 类一样的方法:


package net.androgames.blog.sample.customdialog.dialog;

import net.androgames.blog.sample.customdialog.R;

import android.app.Dialog;

import android.content.Context;

import android.content.DialogInterface;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup.LayoutParams;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.TextView;

public class CustomDialog extends Dialog {

 

 public CustomDialog(Context context, int theme) {

     super(context, theme);

 }

 

 public CustomDialog(Context context) {

     super(context);

 }

 

 /**

  * Helper class for creating a custom dialog

  */

 public static class Builder {

 

     private Context context;

     private String title;

     private String message;

     private String positiveButtonText;

     private String negativeButtonText;

     private View contentView;

 

     private DialogInterface.OnClickListener

                     positiveButtonClickListener,

                     negativeButtonClickListener;

 

     public Builder(Context context) {

         this.context = context;

     }

 

     /**

      * Set the Dialog message from String

      * @param title

      * @return

      */

     public Builder setMessage(String message) {

         this.message = message;

         return this;

     }

 

     /**

      * Set the Dialog message from resource

      * @param title

      * @return

      */

     public Builder setMessage(int message) {

         this.message = (String) context.getText(message);

         return this;

     }

 

     /**

      * Set the Dialog title from resource

      * @param title

      * @return

      */

     public Builder setTitle(int title) {

         this.title = (String) context.getText(title);

         return this;

     }

 

     /**

      * Set the Dialog title from String

      * @param title

      * @return

      */

     public Builder setTitle(String title) {

         this.title = title;

         return this;

     }

 

     /**

      * Set a custom content view for the Dialog.

      * If a message is set, the contentView is not

      * added to the Dialog...

      * @param v

      * @return

      */

     public Builder setContentView(View v) {

         this.contentView = v;

         return this;

     }

 

     /**

      * Set the positive button resource and it's listener

      * @param positiveButtonText

      * @param listener

      * @return

      */

     public Builder setPositiveButton(int positiveButtonText,

             DialogInterface.OnClickListener listener) {

         this.positiveButtonText = (String) context

                 .getText(positiveButtonText);

         this.positiveButtonClickListener = listener;

         return this;

     }

 

     /**

      * Set the positive button text and it's listener

      * @param positiveButtonText

      * @param listener

      * @return

      */

     public Builder setPositiveButton(String positiveButtonText,

             DialogInterface.OnClickListener listener) {

         this.positiveButtonText = positiveButtonText;

         this.positiveButtonClickListener = listener;

         return this;

     }

 

     /**

      * Set the negative button resource and it's listener

      * @param negativeButtonText

      * @param listener

      * @return

      */

     public Builder setNegativeButton(int negativeButtonText,

             DialogInterface.OnClickListener listener) {

         this.negativeButtonText = (String) context

                 .getText(negativeButtonText);

         this.negativeButtonClickListener = listener;

         return this;

     }

 

     /**

      * Set the negative button text and it's listener

      * @param negativeButtonText

      * @param listener

      * @return

      */

     public Builder setNegativeButton(String negativeButtonText,

             DialogInterface.OnClickListener listener) {

         this.negativeButtonText = negativeButtonText;

         this.negativeButtonClickListener = listener;

         return this;

     }

 

     /**

      * Create the custom dialog

      */

     public CustomDialog create() {

         LayoutInflater inflater = (LayoutInflater) context

                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         // instantiate the dialog with the custom Theme

         final CustomDialog dialog = new CustomDialog(context,

                 R.style.Dialog);

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

         dialog.addContentView(layout, new LayoutParams(

                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

         // set the dialog title

         ((TextView) layout.findViewById(R.id.title)).setText(title);

         // set the confirm button

         if (positiveButtonText != null) {

             ((Button) layout.findViewById(R.id.positiveButton))

                     .setText(positiveButtonText);

             if (positiveButtonClickListener != null) {

                 ((Button) layout.findViewById(R.id.positiveButton))

                         .setOnClickListener(new View.OnClickListener() {

                             public void onClick(View v) {

                                 positiveButtonClickListener.onClick(

                                         dialog,

                                         DialogInterface.BUTTON_POSITIVE);

                             }

                         });

             }

         } else {

             // if no confirm button just set the visibility to GONE

             layout.findViewById(R.id.positiveButton).setVisibility(

                     View.GONE);

         }

         // set the cancel button

         if (negativeButtonText != null) {

             ((Button) layout.findViewById(R.id.negativeButton))

                     .setText(negativeButtonText);

             if (negativeButtonClickListener != null) {

                 ((Button) layout.findViewById(R.id.negativeButton))

                         .setOnClickListener(new View.OnClickListener() {

                             public void onClick(View v) {

                                 positiveButtonClickListener.onClick(

                                         dialog,

                                         DialogInterface.BUTTON_NEGATIVE);

                             }

                         });

             }

         } else {

             // if no confirm button just set the visibility to GONE

             layout.findViewById(R.id.negativeButton).setVisibility(

                     View.GONE);

         }

         // set the content message

         if (message != null) {

             ((TextView) layout.findViewById(

                     R.id.message)).setText(message);

         } else if (contentView != null) {

             // if no message set

             // add the contentView to the dialog body

             ((LinearLayout) layout.findViewById(R.id.content))

                     .removeAllViews();

             ((LinearLayout) layout.findViewById(R.id.content))

                     .addView(contentView,

                             new LayoutParams(

                                     LayoutParams.WRAP_CONTENT,

                                     LayoutParams.WRAP_CONTENT));

         }

         dialog.setContentView(layout);

         return dialog;

     }

 

 }

 

}


 

使用自定义的 Builder

使用方法很简单:


public Dialog onCreateDialog(int dialogId) {

  Dialog dialog = null;

  switch (dialogId) {

      case CUSTOM_DIALOG :

          CustomDialog.Builder customBuilder = new

              CustomDialog.Builder(CustomDialogActivity.this);

          customBuilder.setTitle("Custom title")

              .setMessage("Custom body")

              .setNegativeButton("Cancel",

                      new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                      CustomDialogActivity.this

                      .dismissDialog(CUSTOM_DIALOG);

                  }

              })

              .setPositiveButton("Confirm",

                      new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                      dialog.dismiss();

                  }

              });

          dialog = customBuilder.create();

          break;

      case DEFAULT_DIALOG :

          AlertDialog.Builder alertBuilder = new

              AlertDialog.Builder(CustomDialogActivity.this);

          alertBuilder.setTitle("Default title")

              .setMessage("Default body")

              .setNegativeButton("Cancel",

                      new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                      dialog.dismiss();

                  }

              })

              .setPositiveButton("Confirm",

                      new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                      CustomDialogActivity.this

                      .dismissDialog(DEFAULT_DIALOG);

                  }

              });

          dialog = alertBuilder.create();

          break;

  }

  return dialog;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android定义dialog是一种可以根据开发者的需求进行自定义对话框。通过自定义dialog,开发者可以实现特定的界面设计和功能。根据引用,我们可以使用AlertDialog.Builder来创建一个普通的弹出框。而根据引用,我们可以通过简单的设置和技巧来实现Android定义dialog。如果想要对话框具有自定义布局,可以创建一个布局文件,然后通过调用AlertDialog.Builder的setView()方法将其添加到对话框中。默认情况下,自定义布局会填充对话框窗口,但是仍然可以使用AlertDialog.Builder的其他方法来添加按钮和标题。此外,开发者还可以完全自定义一个Dialog,需要进行以下几步: 1. 定义一个style 2. 创建一个继承自Dialog的子类 3. 在子类中实现自定义布局和相关功能 4. 在应用中调用自定义dialog的实例来显示对话框。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [android之自定义Dialog](https://blog.csdn.net/weixin_41796401/article/details/96636408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Android定义dialog简单实现方法](https://download.csdn.net/download/weixin_38736562/12800768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值