码迷,mamicode.com
首页 > 其他好文 > 详细

自定义Dialog

时间:2015-05-25 10:06:39      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:安卓   自定义view   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(); //这一句不可漏
}


以上就是分享的内容,thx~











自定义Dialog

标签:安卓   自定义view   dialog   

原文地址:http://blog.csdn.net/u012336923/article/details/45957635

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!