android自定义对话框

继上一篇《android系统自带对话框》,在我们android的开发中,系统自带的对话框已经远远不能满足我们的需求,所以一款软件要有自己独特风格,一般都会采用自定义对话框。

简单的总结:自定义对话框有如下步骤。

1.自定义对话框样式(R.style.xxx)

2.自定义对话框布局(R.layout.xxx)

3.通过Dialog构建对话框(Dialog.setContentView(R.layout.xxx))

4.处理事件和业务逻辑(按钮,列表,复选框等等)


1)自定对话框样式:/项目/res/values/styles.xml

<style name="MyDialog" parent="@android:style/Theme.Dialog">
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowNoTitle">true</item>
</style>
这里继承了对话框的样式,只对 android:windowBackground (对话框背景:透明)和 windowNoTitle(没有标题)作了修改。
值得注意的是,当我们修改了android:windowBackground为透明以后,会出现如下的现象(在自定义布局中会作处理):



2)自定义布局


处理对话框出现全屏的现象。

    android:background="@android:color/transparent"
    android:padding="20dp"

布局代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:padding="20dp" >

    <LinearLayout
        android:id="@+id/info_ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/title_tv"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center_vertical"
            android:paddingLeft="10dp"
            android:text="这是标题"
            android:textColor="@android:color/black"
            android:textSize="18sp"
            android:textStyle="bold" />

        <View
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#008BCC" />

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >

            <TextView
                android:id="@+id/msg_tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:minHeight="80dp"
                android:paddingLeft="10dp"
                android:text="这是内容,你确定要退出吗?"
                android:textColor="@android:color/black"
                android:textSize="15sp" />
        </ScrollView>

        <LinearLayout
            android:id="@+id/bottom_ll"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal"
            android:padding="3dp" >

            <Button
                android:id="@+id/confirm_btn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="确定"
                android:textColor="@android:color/black"
                android:textSize="18sp" />

            <Button
                android:id="@+id/cancel_btn"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="取消"
                android:textColor="@android:color/black"
                android:textSize="18sp" />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>


3.通过DIalog构建对话框(这里继承了Dialog)

   1.直接通过构造函数对样式(R.style.MyDialog)和布局(R.layout.dialog_standard)进行加载;

   2.通过create(),创建对话框,事件和业务逻辑基本都是在这里处理的;

   3.通过show()方法显示对话框。


public class PromptDialog extends Dialog implements DialogInterface {

	public static final int BUTTON_CONFIRM = -1;

	public static final int BUTTON_CANCEL = -2;

	private TextView mTitleTv, mMsgTv;
	private Button mCancelBtn, mConfirmBtn;
	private String mCancelName, mConfirmName;
	private String mTitle, mMsg;

	private OnClickListener onCancelListener, onConfirmListener;

	public PromptDialog(Context context, String title, String msg) {
		super(context, R.style.MyDialog);
		setContentView(R.layout.dialog_standard);
		mTitleTv = (TextView) this.findViewById(R.id.title_tv);
		mMsgTv = (TextView) this.findViewById(R.id.msg_tv);
		mConfirmBtn = (Button) this.findViewById(R.id.confirm_btn);
		mCancelBtn = (Button) this.findViewById(R.id.cancel_btn);
		this.mTitle = title;
		this.mMsg = msg;
	}

	public PromptDialog(Context context) {
		this(context, null, null);
	}

	/**
	 * 设置确定按钮
	 * 
	 * @param btnName
	 *            按钮名称
	 * @param onClickListener
	 *            按钮监听
	 * @return PromptDialog
	 */
	public PromptDialog setOnConfirmButton(String btnName,
			OnClickListener onClickListener) {
		this.mConfirmName = btnName;
		this.onConfirmListener = onClickListener;
		return this;
	}

	/**
	 * 设置取消按钮
	 * 
	 * @param btnName
	 *            按钮名称
	 * @param onClickListener
	 *            按钮监听
	 * @return PromptDialog
	 */
	public PromptDialog setOnCancelButton(String btnName,
			OnClickListener onClickListener) {
		this.mCancelName = btnName;
		this.onCancelListener = onClickListener;
		return this;
	}

	/**
	 * 设置标题
	 * 
	 * @param title
	 * @return PromptDialog
	 */
	public PromptDialog setTitle(String title) {
		this.mTitle = title;
		return this;
	}

	/**
	 * 设置消息内容
	 * 
	 * @param msg
	 * @return PromptDialog
	 */
	public PromptDialog setMessage(String msg) {
		this.mMsg = msg;
		return this;
	}

	public PromptDialog create() {

		if (mTitle == null) {
			mTitleTv.setVisibility(View.GONE);
		} else {
			mTitleTv.setText(mTitle);
		}
		if (mMsg == null) {
			mMsgTv.setVisibility(View.GONE);
		} else {
			mMsgTv.setText(mMsg);
		}

		if (onConfirmListener != null) {
			mConfirmBtn.setText(mConfirmName);
			mConfirmBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					onConfirmListener
							.onClick(PromptDialog.this, BUTTON_CONFIRM);
				}
			});
		} else {
			mConfirmBtn.setVisibility(View.GONE);
		}

		if (onCancelListener != null) {
			mCancelBtn.setText(mCancelName);
			mCancelBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					onConfirmListener.onClick(PromptDialog.this, BUTTON_CANCEL);
				}
			});
		} else {
			mCancelBtn.setVisibility(View.GONE);
		}
		return this;
	}
}

4)事件和业务逻辑处理

       要处理的事件和业务逻辑比较简单,主要是对两个按钮的处理,通过对外提供接口的形式,

    private OnClickListener onCancelListener, onConfirmListener;
       

     设置确定按钮

	public PromptDialog setOnConfirmButton(String btnName,
			OnClickListener onClickListener) {
		this.mConfirmName = btnName;
		this.onConfirmListener = onClickListener;
		return this;
	}


              设置取消按钮

	public PromptDialog setOnCancelButton(String btnName,
			OnClickListener onClickListener) {
		this.mCancelName = btnName;
		this.onCancelListener = onClickListener;
		return this;
	}


     对外提供按钮处理接口:

   onConfirmListener.onClick(PromptDialog.this, BUTTON_CONFIRM);

<span style="white-space:pre">		</span>if (onConfirmListener != null) {
			mConfirmBtn.setText(mConfirmName);
			mConfirmBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					onConfirmListener
							.onClick(PromptDialog.this, BUTTON_CONFIRM);
				}
			});
		} else {
			mConfirmBtn.setVisibility(View.GONE);
		}

		if (onCancelListener != null) {
			mCancelBtn.setText(mCancelName);
			mCancelBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					onConfirmListener.onClick(PromptDialog.this, BUTTON_CANCEL);
				}
			});
		} else {
			mCancelBtn.setVisibility(View.GONE);
		}

5.MainActivity:创建自定义对话框

   

	<span style="white-space:pre">	</span>PromptDialog promptDialog = new PromptDialog(mContext, "提示",
					"你确定要退出?");
			promptDialog.setOnConfirmButton("确定",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.dismiss();
						}
					});
			promptDialog.setOnCancelButton("取消",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.dismiss();
						}
					});
			promptDialog.create().show();

以上是自定义对话框中的常用的一种,还有自定义单选对话框和自定义多选对话框。其实现的技术都差不多,如果第一种会的话,其他应该没不是问题。

点击下载源码




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值