在做项目时,很多时候会用的对话框,安卓默认的对话框又太丑了,不能满足我们的需要,下面我就介绍一种自定Dilog
先来看一下效果
可以看到上面分为三个部分,提示部分,中间的内容部分,还有下面两按钮部分。
我把这部分做成可控制的的,一般“提示”这个有需要的也有不需要的,那么不需要时可以隐藏,需要时可以显示
然后中间的这部分是你要提示的信息,这个布局呢也是设置成自定义布局,这个布局中你可以像我一样,只要一个TextView,展示提示信息即可,也可以根据自己的需要添加另外的控件,比如EditText,等,都是在一个布局中设置就ok
下面的按钮部分呢也是自定义的两个按钮布局,分别放在drawable文件加下,这个按钮你可以手动修改他的样式,这里我就用一种了,一会再说怎么修改
好了接下来做中主要的部分,废话不多说上代码
package com.mydialog.widget;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.*;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import com.mydiaolg.activity.R;
/**
* 自定义Dialog
*/
public class CustomDialog {
private Context context;
private AlertDialog ad;
private TextView title;
private LinearLayout titleLayout;
private LinearLayout contentLayout;
private LinearLayout buttonLayout;
public CustomDialog(Context context) {
this.context = context;
ad = new AlertDialog.Builder(context).create();
ad.setCancelable(false);
ad.show();
Window window = ad.getWindow();
window.setContentView(R.layout.custom_dialog);
//设置dialog的宽度
WindowManager.LayoutParams lp = window.getAttributes();
// 获取屏幕宽、高用
Display d = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
lp.width = (int) (d.getWidth() * 0.85);
window.setAttributes(lp);
// 解决AlertDialog弹不出输入法的问题
window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//初始化控件
title = (TextView) window.findViewById(R.id.reminder_title);
titleLayout = (LinearLayout) window.findViewById(R.id.dialog_title);
contentLayout = (LinearLayout) window.findViewById(R.id.dialog_content);
buttonLayout = (LinearLayout) window.findViewById(R.id.dialog_btn);
}
/**
* 设置title id
*/
public void setTitleName(int resId) {
title.setText(resId);
}
/**
* 设置title 内容
* @param titleName
*/
public void setTitleName(String titleName) {
title.setText(titleName);
}
/**获取titile布局view*/
public TextView getTitleView() {
return title;
}
/**
* 显示或隐藏头部
*
* @param isShow 是否显示头部
*/
public void showTitle(boolean isShow) {
if (isShow) {
titleLayout.setVisibility(View.VISIBLE);
} else {
titleLayout.setVisibility(View.GONE);
}
}
/**
* 设置内容
*
* @param layoutId 布局id
*/
public void setContentView(int layoutId, LayoutParams params) {
LayoutInflater inflaterDl = LayoutInflater.from(context);
View view = inflaterDl.inflate(layoutId, null);
contentLayout.addView(view, params);
contentLayout.setVisibility(View.VISIBLE);
}
/**
* 设置内容
*
* @param view 视图
* @param params 布局参数
*/
public void setContentView(View view, LayoutParams params) {
contentLayout.removeAllViews();
contentLayout.addView(view, params);
contentLayout.setVisibility(View.VISIBLE);
}
public View getContentView() {
return contentLayout;
}
/**
* 设置按钮
*
* @param text 按钮显示文字
* @param resId 按钮背景图片布局
* @param listener 按钮点击事件
*/
public void setButton(String text, int resId, final View.OnClickListener listener) {
TextView button = new TextView(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT, 1);
button.setLayoutParams(params);
button.setGravity(Gravity.CENTER);
button.setBackgroundResource(resId);
button.setText(text);
button.setTextColor(Color.WHITE);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
button.setOnClickListener(listener);
params.setMargins(dip2px(context, 15), 0, dip2px(context, 15), 0);
button.setLayoutParams(params);
buttonLayout.addView(button);
buttonLayout.setVisibility(View.VISIBLE);
}
/**
* 关闭对话框
*/
public void dismiss() {
ad.dismiss();
}
/**
* 展示对话框
*/
public void show() {
ad.show();
}
/**
* 设置是否可以关闭
*
* @param cancelable true或false
*/
public void setCancelable(boolean cancelable) {
ad.setCancelable(cancelable);
}
/**
* 设置是否可以点击dialog外面关闭dialog
*
* @param canceledOnTouchOutside true或false
*/
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
ad.setCanceledOnTouchOutside(canceledOnTouchOutside);
}
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 设置dialog消失事件
*
* @param onDismissListener dialog消失事件
*/
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
ad.setOnDismissListener(onDismissListener);
}
}
下面来看下custom_dialog.xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/bg_dialog"
android:paddingBottom="15dp"
android:paddingTop="15dp">
<LinearLayout
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:orientation="vertical"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<TextView
android:id="@+id/reminder_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:textColor="#ff323232"
android:textSize="22sp" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/bg_public_line"
android:contentDescription="@null"
android:scaleType="fitXY" />
</LinearLayout>
<LinearLayout
android:id="@+id/dialog_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:visibility="gone" />
<LinearLayout
android:id="@+id/dialog_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="15dp"
android:visibility="gone" />
</LinearLayout>
主要的东西就在上面了,下面我们来调用,这里我就把调用过程放在一个方法里
大家可以根据自己需要调用
/**
* 弹出对话框
*/
private void showDialog(){
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
View mDialogView = inflater.inflate(R.layout.dialog_public_content, null);
TextView textView = (TextView) mDialogView.findViewById(R.id.my_content_text);
textView.setText("你确定好做XXX事情吗?");
final CustomDialog customDialog = new CustomDialog(MainActivity.this);
customDialog.showTitle(true);
customDialog.setTitleName(R.string.pubilc_dialog_title);
customDialog.setContentView(mDialogView, params);
//取消
customDialog.setButton(getString(R.string.public_cancel),
R.drawable.btn_cancel_selector, new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.dismiss();
}
});
//确定
customDialog.setButton(getString(R.string.public_ok),
R.drawable.btn_ok_selector, new View.OnClickListener() {
@Override
public void onClick(View v) {
//确定事件,这里可以监听你要确定的事情,例如提交数据等
customDialog.dismiss();
}
});
}
这里有三个布局dialog_public_content.xml展示你提示的内容信息的,好有就是放在drawable下的btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了,
下面来看下dialog_public_content.xml,这个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/my_content_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff333333"
android:textSize="16sp" />
</LinearLayout>
这个TextVIew就是最开始图中看到的“你确定要做XXX 事情吗?”对应的TextVIew,在这个布局中你可以根据自己需要修改布局中的控件,然后调用就ok
这么做为了扩展性,例如我可在这布局中设置EditText,提示用户输入某些信息等
那么btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了布局是一样的,只是里面的图片不一样罢了
你可以根据需要写两可以只用一个,好了看下btn_ok_selector.xml中的内容吧
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_btn_ok_press" android:state_pressed="true" />
<item android:drawable="@drawable/bg_btn_ok_normal" />
</selector>
好了大功告成,你可以直接调用了,下面我来调用一下
这个是一个简单的调用过程,大家知道怎么使用就ok了,
部分的资源文件图片什么的放在了drawable-hdip文件夹中,
下面我把Demo的地址给大家,有需要的可以去下载看一下
下载地址是:http://download.csdn.net/detail/shaozucheng/8243089
原文地址:http://blog.csdn.net/shaozucheng/article/details/41843377