android自定义对话框

来源:互联网 发布:武汉软件新城论坛 编辑:程序博客网 时间:2024/05/16 10:41

继上一篇《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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});promptDialog.setOnCancelButton("取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});promptDialog.create().show();

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

点击下载源码




1 0