您的位置:首页 > 移动开发 > Android开发

android自定义对话框

2014-12-27 16:06 218 查看
继上一篇《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();


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

点击下载源码



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: