自定义Dialog

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义Dialog相关的知识,希望对你有一定的参考价值。

Android自带的dialog往往不能够满足我们设计的要求,所以有的时候需要自己自定义Dialog。

例如,以下介绍如下的自定义Dialog:

技术分享

思路:

1.自定义一个Dialog的Style;

2.编写自定义的Dialog类,继承自Dialog;

3.使用自定义的Dialog;

 

具体实现的步骤:

1.定义Style:

 

  1. <style name="CustomDialog" parent="android:style/Theme.Dialog">  
  2.         <item name="android:windowFrame">@null</item>  
  3.         <item name="android:windowIsFloating">true</item>  
  4.         <item name="android:windowNoTitle">true</item>  
  5.         <item name="android:windowBackground">@android:color/transparent</item>  
  6.         <item name="android:backgroundDimEnabled">true</item>  
  7.     </style>  

 

其中的属性意思如下:

<item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无

<item name="android:windowIsFloating">true</item>:是否浮现在activity之上

<item name="android:windowNoTitle">true</item>:是否有标题栏

<item name="android:windowBackground">@android:color/transparent</item>:设置Dialog的背景

<item name="android:backgroundDimEnabled">true</item>:背景是否模糊显示

 

2.编写自定义的Dialog类:

a)首先需要定义我们所要显示的Dialog布局文件:/ layout / view_dialog.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_marginLeft="15dp"  
  6.     android:layout_marginRight="15dp"  
  7.     android:background="@drawable/defaulting_dialog_bg"  <!-- defaulting_dialog_bg为背景图片 -->  
  8.     android:gravity="center"  
  9.     android:orientation="vertical" >  
  10.   
  11. <!-- 内容区域 -->  
  12.     <TextView  
  13.         android:id="@+id/id_dialog_content"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:gravity="center"  
  17.         android:padding="30dp"  
  18.         android:textColor="@color/black"  
  19.         android:textSize="18sp" />  
  20.   
  21. <!-- 分割线 -->  
  22.     <include layout="@layout/sub_line" />  
  23.   
  24.     <LinearLayout  
  25.         android:layout_width="match_parent"  
  26.         android:layout_height="50dp"  
  27.         android:gravity="center"  
  28.         android:orientation="horizontal" >  
  29.   
  30. <!-- 取消按钮 -->  
  31.         <Button  
  32.             android:id="@+id/id_dialog_no"  
  33.             android:layout_width="0dp"  
  34.             android:layout_height="match_parent"  
  35.             android:layout_weight="1"  
  36.             android:background="@android:color/transparent"  
  37.             android:gravity="center"  
  38.             android:textColor="@color/black"  
  39.             android:textSize="16sp" />  
  40.   
  41. <!-- 确定按钮与取消按钮的垂直分割线 -->  
  42.         <ImageView  
  43.             android:layout_width="1.0px"  
  44.             android:layout_height="match_parent"  
  45.             android:layout_marginBottom="4dp"  
  46.             android:layout_marginTop="4dp"  
  47.             android:background="@color/grey_line" />  
  48.   
  49. <!-- 取消按钮 -->  
  50.         <Button  
  51.             android:id="@+id/id_dialog_yes"  
  52.             android:layout_width="0dp"  
  53.             android:layout_height="match_parent"  
  54.             android:layout_weight="1"  
  55.             android:background="@android:color/transparent"  
  56.             android:gravity="center"  
  57.             android:textColor="@color/black"  
  58.             android:textSize="16sp" />  
  59.     </LinearLayout>  
  60.   
  61. </LinearLayout>  

 

 

其中的水平分割线:/ layout / sub_line.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ImageView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="1px"  
  5.     android:background="@color/grey_line" >  
  6. </ImageView>  


其中涉及到的颜色:/ res / values / colors.xml

 

 

 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <color name="black">#000000</color>  
  5.     <color name="grey_line">#e0e0e0</color>  
  6.   
  7. </resources>  


b)写完布局文件,就可以在java中定义自定义的Dialog类了:

 

详细说明都在代码中:

 

 
  1. package com.yao.custom;  
  2.   
  3. import android.app.Dialog;  
  4. import android.content.Context;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. import com.yao.R;  
  12.   
  13. public class CustomDialog extends Dialog implements  
  14.         android.view.View.OnClickListener {  
  15.   
  16.     private static int mTheme = R.style.CustomDialog; // 自定义Dialog对应的Style  
  17.   
  18.     private Button mYesButton; // 确定按钮  
  19.   
  20.     private Button mNoButton; // 取消按钮  
  21.   
  22.     private TextView mContent; // 内容区域  
  23.   
  24.     private OnCustomDialogListener mListener; // 自定义接口OnCustomDialogListener:确定按钮和取消按钮的监听器  
  25.   
  26.     public CustomDialog(Context context) { // 构造方法  
  27.         this(context, mTheme);  
  28.     }  
  29.   
  30.     public CustomDialog(Context context, int theme) { // 必须实现的构造方法  
  31.         super(context, theme);  
  32.     }  
  33.   
  34.     public void setCustomOnClickListener(OnCustomDialogListener listener) { // 为确定按钮和取消按钮设置监听器  
  35.         mListener = listener;  
  36.     }  
  37.   
  38.     private static final int MESSAGE_SET_CONTENT = 0x10; //用来执行初始化操作的消息标识  
  39.   
  40.     private static final int MESSAGE_SET_YES_BTN_TEXT = 0x11;  
  41.   
  42.     private static final int MESSAGE_SET_NO_BTN_TEXT = 0x12;  
  43.   
  44.     private static final int MESSAGE_SET_YES_BTN_TEXT_COLOR = 0x13;  
  45.   
  46.     private static final int MESSAGE_SET_NO_BTN_TEXT_COLOR = 0x14;  
  47.   
  48.     private Handler mHandler = new Handler() { // 统一用Handler来执行我们的初始化操作:例如设置Dialog内容,设置取消/确定按钮的文字和颜色  
  49.         public void handleMessage(android.os.Message msg) {  
  50.             switch (msg.what) {  
  51.             case MESSAGE_SET_CONTENT: // 设置内容区域内容  
  52.                 mContent.setText((String) msg.obj);  
  53.                 break;  
  54.   
  55.             case MESSAGE_SET_YES_BTN_TEXT: // 设置确定按钮的文字  
  56.                 mYesButton.setText((String) msg.obj);  
  57.                 break;  
  58.   
  59.             case MESSAGE_SET_NO_BTN_TEXT: // 设置取消按钮的文字  
  60.                 mNoButton.setText((String) msg.obj);  
  61.                 break;  
  62.   
  63.             case MESSAGE_SET_YES_BTN_TEXT_COLOR: // 设置确定按钮的文字颜色  
  64.                 mYesButton.setTextColor(msg.arg1);  
  65.                 break;  
  66.   
  67.             case MESSAGE_SET_NO_BTN_TEXT_COLOR: // 设置取消按钮的文字颜色  
  68.                 mNoButton.setTextColor(msg.arg1);  
  69.                 break;  
  70.             }  
  71.         };  
  72.     };  
  73.   
  74.     @Override  
  75.     protected void onCreate(Bundle savedInstanceState) {  
  76.         super.onCreate(savedInstanceState);  
  77.         setContentView(R.layout.view_dialog); // 引用以上定义的布局文件  
  78.   
  79.         mYesButton = (Button) findViewById(R.id.id_dialog_yes); // 控件初始化以及  
  80.         mYesButton.setOnClickListener(this);  
  81.   
  82.         mNoButton = (Button) findViewById(R.id.id_dialog_no);  
  83.         mNoButton.setOnClickListener(this);  
  84.   
  85.         mContent = (TextView) findViewById(R.id.id_dialog_content);  
  86.     }  
  87.   
  88.     public interface OnCustomDialogListener { // 自定义接口,确定/取消按钮的点击事件  
  89.         void setYesOnClick(); // 确定按钮点击  
  90.   
  91.         void setNoOnClick(); // 取消按钮点击  
  92.     }  
  93.   
  94.     @Override  
  95.     public void onClick(View v) { // 实现OnClickListener接口  
  96.         switch (v.getId()) {  
  97.         case R.id.id_dialog_yes:  
  98.             mListener.setYesOnClick();  
  99.             break;  
  100.   
  101.         case R.id.id_dialog_no:  
  102.             mListener.setNoOnClick();  
  103.             break;  
  104.         }  
  105.     }  
  106.   
  107.      // Dialog对外提供的设置方法,有设置内容区域内容、确定/取消按钮文字以及颜色的方法,若想添加其他功能的实现,也可通过此方法  
  108.     public void setContent(String content) {  
  109.         android.os.Message msg = mHandler.obtainMessage(); // 用Handler发送Message来进行初始化操作  
  110.         msg.what = MESSAGE_SET_CONTENT;  
  111.         msg.obj = content;  
  112.         mHandler.sendMessage(msg);  
  113.     }  
  114.   
  115.     public void setYesBtnText(String yesText) {  
  116.         android.os.Message msg = mHandler.obtainMessage();  
  117.         msg.what = MESSAGE_SET_YES_BTN_TEXT;  
  118.         msg.obj = yesText;  
  119.         mHandler.sendMessage(msg);  
  120.     }  
  121.   
  122.     public void setYesBtnTextColor(int colorId) {  
  123.         android.os.Message msg = mHandler.obtainMessage();  
  124.         msg.what = MESSAGE_SET_YES_BTN_TEXT_COLOR;  
  125.         msg.arg1 = colorId;  
  126.         mHandler.sendMessage(msg);  
  127.     }  
  128.   
  129.     public void setNoBtnText(String noText) {  
  130.         android.os.Message msg = mHandler.obtainMessage();  
  131.         msg.what = MESSAGE_SET_NO_BTN_TEXT;  
  132.         msg.obj = noText;  
  133.         mHandler.sendMessage(msg);  
  134.     }  
  135.   
  136.     public void setNoBtnTextColor(int colorId) {  
  137.         android.os.Message msg = mHandler.obtainMessage();  
  138.         msg.what = MESSAGE_SET_NO_BTN_TEXT_COLOR;  
  139.         msg.arg1 = colorId;  
  140.         mHandler.sendMessage(msg);  
  141.     }  
  142.   
  143. }  

 

3.使用自定义的Dialog:

 

  1. final CustomDialog loginDialog = new CustomDialog(getActivity());  
  2. loginDialog.setContent("您还没有登陆,不能邀请好友。是否立即登陆邀请好友?");  
  3. loginDialog.setYesBtnText("登陆");  
  4. loginDialog.setNoBtnText("暂不");  
  5. loginDialog.setYesBtnTextColor(getResources().getColor(R.color.black));  
  6. loginDialog.setCustomOnClickListener(new OnCustomDialogListener() {     
  7.                 @Override  
  8.         public void setYesOnClick() {  
  9.                 //TODO  
  10.         }  
  11.   
  12.         @Override  
  13.         public void setNoOnClick() {  
  14.                 loginDialog.dismiss();  
  15.         }  
  16.         });  
  17. loginDialog.show(); //这一句不可漏  
  18. }  

 

以上是关于自定义Dialog的主要内容,如果未能解决你的问题,请参考以下文章

浅谈android中的自定义封装易用的Dialog

【Android】自定义全屏dialog

怎么自定义dialog样式

自定义dialog可动态更新吗

自定义控件(Dialog篇)

自定义控件(Dialog篇)