自定义Dialog
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义Dialog相关的知识,希望对你有一定的参考价值。
Android自带的dialog往往不能够满足我们设计的要求,所以有的时候需要自己自定义Dialog。
例如,以下介绍如下的自定义Dialog:
思路:
1.自定义一个Dialog的Style;
2.编写自定义的Dialog类,继承自Dialog;
3.使用自定义的Dialog;
具体实现的步骤:
1.定义Style:
- <style name="CustomDialog" parent="android:style/Theme.Dialog">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowIsFloating">true</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:backgroundDimEnabled">true</item>
- </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
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="15dp"
- android:layout_marginRight="15dp"
- android:background="@drawable/defaulting_dialog_bg" <!-- defaulting_dialog_bg为背景图片 -->
- android:gravity="center"
- android:orientation="vertical" >
- <!-- 内容区域 -->
- <TextView
- android:id="@+id/id_dialog_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:padding="30dp"
- android:textColor="@color/black"
- android:textSize="18sp" />
- <!-- 分割线 -->
- <include layout="@layout/sub_line" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:gravity="center"
- android:orientation="horizontal" >
- <!-- 取消按钮 -->
- <Button
- android:id="@+id/id_dialog_no"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@android:color/transparent"
- android:gravity="center"
- android:textColor="@color/black"
- android:textSize="16sp" />
- <!-- 确定按钮与取消按钮的垂直分割线 -->
- <ImageView
- android:layout_width="1.0px"
- android:layout_height="match_parent"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="4dp"
- android:background="@color/grey_line" />
- <!-- 取消按钮 -->
- <Button
- android:id="@+id/id_dialog_yes"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@android:color/transparent"
- android:gravity="center"
- android:textColor="@color/black"
- android:textSize="16sp" />
- </LinearLayout>
- </LinearLayout>
其中的水平分割线:/ layout / sub_line.xml
- <?xml version="1.0" encoding="utf-8"?>
- <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="@color/grey_line" >
- </ImageView>
其中涉及到的颜色:/ res / values / colors.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="black">#000000</color>
- <color name="grey_line">#e0e0e0</color>
- </resources>
b)写完布局文件,就可以在java中定义自定义的Dialog类了:
详细说明都在代码中:
- package com.yao.custom;
- import android.app.Dialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- import com.yao.R;
- public class CustomDialog extends Dialog implements
- android.view.View.OnClickListener {
- private static int mTheme = R.style.CustomDialog; // 自定义Dialog对应的Style
- private Button mYesButton; // 确定按钮
- private Button mNoButton; // 取消按钮
- private TextView mContent; // 内容区域
- private OnCustomDialogListener mListener; // 自定义接口OnCustomDialogListener:确定按钮和取消按钮的监听器
- public CustomDialog(Context context) { // 构造方法
- this(context, mTheme);
- }
- public CustomDialog(Context context, int theme) { // 必须实现的构造方法
- super(context, theme);
- }
- public void setCustomOnClickListener(OnCustomDialogListener listener) { // 为确定按钮和取消按钮设置监听器
- mListener = listener;
- }
- private static final int MESSAGE_SET_CONTENT = 0x10; //用来执行初始化操作的消息标识
- private static final int MESSAGE_SET_YES_BTN_TEXT = 0x11;
- private static final int MESSAGE_SET_NO_BTN_TEXT = 0x12;
- private static final int MESSAGE_SET_YES_BTN_TEXT_COLOR = 0x13;
- private static final int MESSAGE_SET_NO_BTN_TEXT_COLOR = 0x14;
- private Handler mHandler = new Handler() { // 统一用Handler来执行我们的初始化操作:例如设置Dialog内容,设置取消/确定按钮的文字和颜色
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case MESSAGE_SET_CONTENT: // 设置内容区域内容
- mContent.setText((String) msg.obj);
- break;
- case MESSAGE_SET_YES_BTN_TEXT: // 设置确定按钮的文字
- mYesButton.setText((String) msg.obj);
- break;
- case MESSAGE_SET_NO_BTN_TEXT: // 设置取消按钮的文字
- mNoButton.setText((String) msg.obj);
- break;
- case MESSAGE_SET_YES_BTN_TEXT_COLOR: // 设置确定按钮的文字颜色
- mYesButton.setTextColor(msg.arg1);
- break;
- case MESSAGE_SET_NO_BTN_TEXT_COLOR: // 设置取消按钮的文字颜色
- mNoButton.setTextColor(msg.arg1);
- break;
- }
- };
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.view_dialog); // 引用以上定义的布局文件
- mYesButton = (Button) findViewById(R.id.id_dialog_yes); // 控件初始化以及
- mYesButton.setOnClickListener(this);
- mNoButton = (Button) findViewById(R.id.id_dialog_no);
- mNoButton.setOnClickListener(this);
- mContent = (TextView) findViewById(R.id.id_dialog_content);
- }
- public interface OnCustomDialogListener { // 自定义接口,确定/取消按钮的点击事件
- void setYesOnClick(); // 确定按钮点击
- void setNoOnClick(); // 取消按钮点击
- }
- @Override
- public void onClick(View v) { // 实现OnClickListener接口
- switch (v.getId()) {
- case R.id.id_dialog_yes:
- mListener.setYesOnClick();
- break;
- case R.id.id_dialog_no:
- mListener.setNoOnClick();
- break;
- }
- }
- // Dialog对外提供的设置方法,有设置内容区域内容、确定/取消按钮文字以及颜色的方法,若想添加其他功能的实现,也可通过此方法
- public void setContent(String content) {
- android.os.Message msg = mHandler.obtainMessage(); // 用Handler发送Message来进行初始化操作
- msg.what = MESSAGE_SET_CONTENT;
- msg.obj = content;
- mHandler.sendMessage(msg);
- }
- public void setYesBtnText(String yesText) {
- android.os.Message msg = mHandler.obtainMessage();
- msg.what = MESSAGE_SET_YES_BTN_TEXT;
- msg.obj = yesText;
- mHandler.sendMessage(msg);
- }
- public void setYesBtnTextColor(int colorId) {
- android.os.Message msg = mHandler.obtainMessage();
- msg.what = MESSAGE_SET_YES_BTN_TEXT_COLOR;
- msg.arg1 = colorId;
- mHandler.sendMessage(msg);
- }
- public void setNoBtnText(String noText) {
- android.os.Message msg = mHandler.obtainMessage();
- msg.what = MESSAGE_SET_NO_BTN_TEXT;
- msg.obj = noText;
- mHandler.sendMessage(msg);
- }
- public void setNoBtnTextColor(int colorId) {
- android.os.Message msg = mHandler.obtainMessage();
- msg.what = MESSAGE_SET_NO_BTN_TEXT_COLOR;
- msg.arg1 = colorId;
- mHandler.sendMessage(msg);
- }
- }
3.使用自定义的Dialog:
- final CustomDialog loginDialog = new CustomDialog(getActivity());
- loginDialog.setContent("您还没有登陆,不能邀请好友。是否立即登陆邀请好友?");
- loginDialog.setYesBtnText("登陆");
- loginDialog.setNoBtnText("暂不");
- loginDialog.setYesBtnTextColor(getResources().getColor(R.color.black));
- loginDialog.setCustomOnClickListener(new OnCustomDialogListener() {
- @Override
- public void setYesOnClick() {
- //TODO
- }
- @Override
- public void setNoOnClick() {
- loginDialog.dismiss();
- }
- });
- loginDialog.show(); //这一句不可漏
- }
以上是关于自定义Dialog的主要内容,如果未能解决你的问题,请参考以下文章