APP开发实战150-Android 提示功能设计(AlertDialog、Toast和Snackbar的使用)

来源:互联网 发布:淘宝开放平台接口 编辑:程序博客网 时间:2024/05/29 18:09

34.12 提示功能设计     

34.12.1三种方案简介

Android里常用的显示提示信息的方式有三种:AlertDialog、Toast和Snackbar。

AlertDialog不会自动消失,需要用户手动操作关闭。

Toast和Snackbar会自动消失,不需要用户手动操作。

对于操作成功的提示信息,如登录成功、提交订单成功等,此类信息即使用户没看到,也不好影响用户使用。可以用Toast或Snackbar显示,然后自动消失,不需要用户点击关闭,减少用户操作。

对于操作失败的提示信息,如登录失败或提交订单失败等,此类信息最好能让用户知道,遇到了什么错误,发便重新提交,用AlertDialog显示比较好,用户没有看到提示信息,然后手动关闭提示框,提示框不好自动消失,确保了用户肯定能看到出错提示。

如果用Toast或Snackbar显示,可能用户还没看到出错提示,Toast或Snackbar就自动消失了;用户不知道什么原因导致操作不成功,只能再次尝试登陆或提交订单,这样会导致用户重复操作,用户体验不好。

34.12.2AlertDialog介绍

Android系统已经提供了AlertDialog类创建AlerDialog,有以下特性:

1 此提示框属于模态提示框,在显示此提示框的时候,用户点击屏幕上的任何区域,都由此提示框响应用户的点击操作,程序的主界面不响应用户操作;即使点击返回按钮,也无响应。

2 当用户点击提示框区域的时候,只有点击到提示框按钮所在的区域,才会响应用户操作;如果用户点击非提示框区域的时候,会关闭提示框。

3 此提示框的创建属于非单例模式,也就是可以连续创建多个提示框,在屏幕上重叠显示。

在APP的某些界面,可能会连续向服务器发送多个请求,如首页;这时如遇到服务器异常的状况,每个请求接口都会报错,这样会在当前界面显示多个提示框,用户需要操作多次,才能关闭所有的提示框,用户体验不好。

针对上述特性,实现了一个AlertDialog工具类,进行如下改进:

1 在显示提示框的时候,屏蔽用户点击非提示框区域,关闭提示框的功能,以免用户还没来及看清提示信息,不小心碰到屏幕,提示框就关闭了。

2 使用单列模式创建提示框,以免屏幕上显示多个重叠的提示框。

具体代码如下:

publicclass AlertDialogUtil {
    private static AlertDialog.Builderbuilder;
   
    public static void showAlertDialog(
            final Context context, StringmessageText) {

//使用静态变量避免重复创建提示框
        if (builder == null) {
            builder = newAlertDialog.Builder(context);
            builder.setTitle("提示")
                    .setIcon(R.drawable.ic_launcher)
                   .setMessage(messageText)
                    //参数设为false,屏蔽用户点击非提示框区域,关闭提示框的功能
                    .setCancelable(false)
                   .setPositiveButton("确定",

newDialogInterface.OnClickListener() {
                        @Override
                        public voidonClick(DialogInterface dialog, int which) {
                           dialog.dismiss();

                            builder =null;
                        }
                    }).create().show();
        }
    }
}

使用方式如下:

AlertDialogUtil.showAlertDialog(this,"AlertDilalog 显示提示信息");

34.12.3Toast介绍

Android系统提供的Toast的特性如下:

1 此提示框属于非模态提示框,在显示此提示框的时候,程序的主界面可响应用户操作。

2 Toast显示的时间可以设置成2秒或3.5秒:

static final intLONG_DELAY = 3500; 

static final intSHORT_DELAY = 2000; 

在显示的时候,如果切换到新界面,Toast还是会显示,直到时间耗尽才消失。

如有多个TAB页,在TAB1显示Toast,切换到TAB2后,可能还会继续显示;或从一个Activity界面跳转到另一个Activity界面的时候,同样如此。

Android提供了关闭Toast的函数cancel(),可以在显示时间耗尽前关闭Toast。

3 此提示框的创建也属于非单例模式,也就是可以连续创建多个提示框,在屏幕上重叠显示。

针对上述特性,实现了一个Toast工具类,进行如下改进:

使用单列模式创建提示框,以免屏幕上显示多个重叠的提示框。

publicclass ToastUtil {

 

    private static Toast toast;

 

    public static void showToast(Contextcontext,

        String messageText, int duration) {

       

        //使用静态变量避免重复创建提示框

        if (toast == null) {

            toast = Toast.makeText(context, messageText,duration);

        } else {

           toast.setText(messageText);

        }

        toast.show();

}

 

publicstatic void dismissToast () {

        toast.cancel();

    }

}

使用方式如下:

ToastUtil.showToast(this,"Toast 显示提示信息",Toast.LENGTH_LONG);

ToastUtil.dismissToast();

注意事项:

在创建Toast的时候,会用到Context参数:或是Application对应的Context、或是Activity对应的Context;这就需要在销毁Application或Activity时,主动关闭Toast,释放资源,否则会有短暂的内存泄露。

34.12.4Snackbar介绍

Android系统提供的Snackbar的特性如下:

1 此提示框属于非模态提示框,在显示此提示框的时候,程序的主界面可响应用户操作。

2 Toast显示的时间可以设置成1.5秒或2.75秒:

private staticfinal int SHORT_DURATION_MS = 1500;

private staticfinal int LONG_DURATION_MS = 2750;

在显示的时候,如果切换到新界面,Snackbar还是会显示,直到时间耗尽才消失。

如有多个TAB页,在TAB1显示Toast,切换到TAB2后,可能还会继续显示;或从一个Activity界面跳转到另一个Activity界面的时候,同样如此。

Android提供了关闭Snackbar的函数dismiss(),可以在显示时间耗尽前关闭Snackbar。

3 此提示框的创建属于单例模式,如果连续创建多个Snackbar,只会显示最后创建的那个。

4 Snackbar也可以像Dialog那样响应用户点击操作。

5 Snackbar不像AlertDialog和Toast那样默认显示在屏幕中部,而是显示在屏幕底部。

Snackbar的使用代码如下:

//连续创建两个Snackbar,但屏幕上只会显示最后创建的Snackbar

Snackbar.make(mView,"Snackbar显示提示信息",

Snackbar.LENGTH_SHORT).show();
Snackbar.make(mView, "Snackbar显示第二个提示信息",

Snackbar.LENGTH_SHORT).show();

 

//响应用户操作的Snackbar

Snackbarsnackbar = Snackbar.make(mView, "Snackbar响应用户操作",Snackbar.LENGTH_SHORT)
           .setAction("确定", new View.OnClickListener(){
                            @Override
                            public void onClick(Viewv) {                          

AlertDialogUtil.showAlertDialog(MainActivity.this,"AlertDilalog 显示提示信息");
                            }
                        });

Snackbar.show();

 

//关闭Snackbar

Snackbar.dismiss();

 

即使Snackbar能够响应用户操作,但还是会在设置的显示时间到后,自动消失。Google似乎也不推荐这样使用Snackbar,在其文档中有如下说明:

Note: A Snackbar automaticallygoes away after a short time, so you can't count on the user seeing the messageor having a chance to press the button. For this reason, you should consideroffering an alternate way to perform any Snackbar action.

(https://developer.android.com/training/snackbar/action.html)

注意事项:

在创建Snackbar的时候,会用到View参数;这就需要在销毁View时,主动关闭Snackbar,释放资源,否则会有短暂的内存泄露。

 

Google推荐用Snackbar代替Toast,从上述分析也可看出Snackbar可以替代Toast,且使用更简单方便。

0 0
原创粉丝点击