昨天在上网无意间发现一个android自定义透明的对话框,看着效果挺不错。于是研究了下。结果是一个第三方的库文件。犹豫了,这个效果虽然看着还不错,但是为了这一个功能引用一个库,觉得有点小题大做。于是乎再深研究发现原来这个库里面就只有两个类,作为一个项目需要引用库的话,如果只有两个类不知道其他程序员们怎么想,反正我是不会为两个类去专门引用一个库,一翻整理后,把这个直接集成到项目里,写了个demo给大家分享:
效果图
首先写之前需要做些准备工作:
一,在res下新建anim文件夹添加一个progressbar.xml文件
二,在drawble文件夹下添加一个transparent_bg.xml文件
三,在values下的styles.xml中添加一个自定义的样式,将来引用
下来看代码
新建一个
TransparentDialog类继承Dialog
public TransparentDialog(Context context, int theme) {
super(context, theme);
}
public static TransparentDialog createDialog(Context context) {
TransparentDialog dialog = new TransparentDialog(context, R.style.Transparent);
dialog.setContentView(R.layout.transparent);
dialog.getWindow().getAttributes().gravity = Gravity.CENTER;
return dialog;
}
public void setMessage(String message) {
TextView msgView = (TextView)findViewById(R.id.transparent_message);
msgView.setText(message);
}
public void setImage(Context ctx, int resId) {
ImageView image = (ImageView)findViewById(R.id.transparent_image);
image.setImageResource(resId);
if(resId==R.drawable.transparent_spinner) {
Animation anim = AnimationUtils.loadAnimation(ctx,R.anim.progressbar);
anim.start();
image.startAnimation(anim);
}
}
然后在新建一个
Transparent类,用于自定义对话框的属性和样式,很简单,每种对话框对应一个方法
public static void showLoadingMessage(Context context, String msg, boolean cancelable) {
dismiss();
setDialog(context, msg, R.drawable.transparent_spinner, cancelable);
if(dialog!=null) dialog.show();
}
其中
dialog.setCancelable(cancelable);方法接收一个布尔值,表示当按下手机back按键时候,对话框是否会消失。
setDialog()可以在里面设置弹出对话框的文字和图片
dismissAfter2s()方法用于关闭对话框,提示消息弹出2秒后关闭,这里我们起了一个线程,用handler发送一个消息,
当接收到消息时候,调用dismiss()方法关闭对话框
正在加载中的弹出框有点特殊,因为我们有时候不知道要加载多久,所以它会一直存在,当我们按下back按键时候会关闭
public static void showErrorMessage(Context context, String msg) {
dismiss();
setDialog(context, msg, R.drawable.transparent_error, true);
if(dialog!=null) {
dialog.show();
dismissAfter2s();
}
}
public static void showSuccessMessage(Context context, String msg) {
dismiss();
setDialog(context, msg, R.drawable.transparent_success, true);
if(dialog!=null) {
dialog.show();
dismissAfter2s();
}
}
public static void showInfoMessage(Context context, String msg) {
dismiss();
setDialog(context, msg, R.drawable.transparent_info, true);
if(dialog!=null) {
dialog.show();
dismissAfter2s();
}
}
private static void setDialog(Context ctx, String msg, int resId, boolean cancelable) {
context = ctx;
if(!isContextValid()){
return;
}
dialog = TransparentDialog.createDialog(ctx);
dialog.setMessage(msg);
dialog.setImage(ctx, resId);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(cancelable); // back键是否可dimiss对话框
}
/**
* 关闭对话框
*/
public static void dismiss() {
if(isContextValid() && dialog!=null && dialog.isShowing())
dialog.dismiss();
dialog = null;
}
/**
* 计时关闭对话框
*
*/
private static void dismissAfter2s() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
private static Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what==0)
dismiss();
};
};
/**
* 判断parent view是否还存在
* 若不存在不能调用dismis,或setDialog等方法
* @return
*/
private static boolean isContextValid() {
if(context==null)
return false;
if(context instanceof Activity) {
Activity act = (Activity)context;
if(act.isFinishing())
return false;
}
return true;
}
public class MainActivity extends Activity implements View.OnClickListener {
private Button LoadingBt;
private Button ErrorBt;
private Button SuccessgBt;
private Button ShowMessageBt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadingBt = (Button) findViewById(R.id.bt_loading);
ErrorBt = (Button) findViewById(R.id.bt_error);
SuccessgBt = (Button) findViewById(R.id.bt_success);
ShowMessageBt = (Button) findViewById(R.id.bt_show_message);
LoadingBt.setOnClickListener(this);
ErrorBt.setOnClickListener(this);
SuccessgBt.setOnClickListener(this);
ShowMessageBt.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_loading:
Transparent.showLoadingMessage(this,"加载中",true);
break;
case R.id.bt_error:
Transparent.showErrorMessage(this,"加载错误");
break;
case R.id.bt_success:
Transparent.showSuccessMessage(this,"加载成功");
break;
case R.id.bt_show_message:
Transparent.showInfoMessage(this,"显示信息");
break;
}
}
}
说明:
Transparent.dismiss(); 方法手动关闭。