一、背景介绍
App在进行比较耗时操作时,通常会给用户一个提示。这样做,一方面照顾到了用户情绪;另一方面也可以避免用户在一头雾水的情况下误操作。比较通常的一种做法:在页面上显示一个“加载中”的Dialog,操作完成之后销毁该Dialog。我在这里把它称为LoadingDialog,下面记录一下我的实现。
二、原理
扩展Dialog,在不改变其行为的前提下改变其外观。主要进行了两个方面的自定义:
1.自定义Dialog的布局文件;
2.自定义Dialog的style;
三、实现
(1)自定义Dialog的布局文件:
//res/layout/dialog_loading
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical"> <LinearLayout android:layout_width="150dp" android:layout_height="150dp" android:gravity="center_vertical|center_horizontal" android:orientation="vertical"> <ProgressBar android:id="@android:id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"/> <TextView android:id="@android:id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="8dp" android:gravity="center" android:textColor="@android:color/white" android:textSize="12sp" android:visibility="visible"/> </LinearLayout> </RelativeLayout>
(2)自定义Dialog的style:
<style name="WinDialog" parent="@android:style/Theme.Dialog">
<!--去掉Dialog的windowFrame框-->
<item name="android:windowFrame">@null</item>
<!--浮在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--非半透明-->
<item name="android:windowIsTranslucent">false</item>
<!--去掉title-->
<item name="android:windowNoTitle">true</item>
<!--dialog的背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
</style>
(3)扩展Dialog,使用上述layout和style:
public class LoadingDialog extends Dialog{
/**
* 提示文字
*/
private TextView mTextView;
public LoadingDialog(Context context) {
//使用自定义的Style
super(context, R.style.WinDialog);
//使用自定义的layout
setContentView(R.layout.dialog_loading);
mTextView = (TextView) findViewById(android.R.id.message);
}
public void setText(String s) {
if (mTextView != null) {
mTextView.setText(s);
mTextView.setVisibility(View.VISIBLE);
}
}
public void setText(int res) {
if (mTextView != null) {
mTextView.setText(res);
mTextView.setVisibility(View.VISIBLE);
}
}
}
四、使用
LoadingDialog dialog = new LoadingDialog(this);
dialog.setText("加载中,请稍候。。。");//设置提示信息
dialog.setCancelable(false);//把dialog设置成不可取消的,用户点击屏幕dialog不消失 默认是true 即点击屏幕之后dialog消失
dialog.show();
注意:如果设置setCancelable为false的话,使用手机的返回键dialog也不会消失。如果希望点击屏幕时dialog不消失,按下返回键时dialog消失可以重写onTouchEvent方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
return false;
}
return super.onTouchEvent(event);
}
最终得到的效果是: