自定义loading dialog

一、背景介绍

    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);
    }

 

最终得到的效果是:

 

posted @ 2016-01-08 17:06  听懂·动听  阅读(1593)  评论(0编辑  收藏  举报