Android界面美化 -- 使用自定义Toast布局替代原生布局

Android自带的Toast

Android Toast实现了一个简单的消息提示框功能。虽然其功能简单,但非常好用,只需要一行代码就可以完成提示信息的显示,自动消除。还可以指定显示的位置,显示的时间长短等。基本上不需要用户交互的提示消息都可以用Toast来实现。
Toast的用法很简单,调用Toast类的静态方法makeText()创建一个Toast,然后再show()即可。例如

Toast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();

执行后就会在屏幕靠近下方的位置显示一个提示消息框。

Toast的一些不足之处

Toast虽然好用,但也有一些不足的地方。

1 界面不美观,表现不一致

默认Toast界面不是很美观,而且不同Android版本的表现也会有差异。此外,各大设备厂家似乎也意思到这一点,都喜欢在自家的ROM中对Toast的界面做不同的修改,这导致同一个Toast消息在不同设备上的表现千差万别。
这里给出了同一个Toast消息在一些设备上的显示效果。
Android2.3系统 这里写图片描述
Android4.2系统 这里写图片描述
Android4.4系统 这里写图片描述
Android5.0系统 这里写图片描述

2 重复提示

Toast的提示消息通常由用户操作触发,如果用户快速执行同一个操作,就会产生一系列的Toast消息。Android系统会维护一个Toast的消息队列,当一个Toast消息被创建后,它就会被添加到消息队列中等待系统处理。只有前一个Toast提示消失后,系统才会处理队列中下一个消息。所以,如果有一系列的Toast消息被添加到队列中,系统就需要较长的时间才能处理完毕,很可能应用的界面都已经被关闭了,Toast消息还在不停的冒出来。

3 显示时间无法自由控制

Toast只允许设置两种不同的消息显示时间,当使用Toast.makeText()或setDuration()设置消息显示的持续时间时,传入Toast.LENGTH_SHORT会显示2秒,传入Toast.LENGTH_LONG会显示3.5秒(2秒和3.5秒是Android原生系统中设置的时间,可能部分定制的ROM会修改这个时间),传入其他的数值都会按照2秒时间来显示。应用无法自由控制Toast的显示时间。
不过这对应用来说,可能并非是一个缺点,由于只有两种时间的设置,调用时就不需要纠结到底要显示多少时间才合适,反而简化了操作。一般来说Toast的这两种时间已经可以满足需要。短时间为2秒,如果显示时间小于2秒,就是一闪而过,所以基本也不会使用。长时间有3.5秒,作为不需要交互的提示消息,时间也是足够长了,太长了反而会影响用户体验。虽然有些场景下需要让提示消息长时间显示,例如需要提示消息一直显示,不自动消失,等待后台代码处理完毕后再由代码去控制其关闭。对这类场景,可能用其他的实现方式,如对话框,PopupWindow,WindowManager或者专门的Loading界面来实现更合适。

Toast自定义布局实现

对Toast界面不美观,显示效果不一致的问题,可以通过自定义布局来实现界面的美化和统一。Toast自定义布局实现步骤如下。

创建布局文件

根据要实现的效果,创建自定义的布局文件。这里给出只有一个TextView和加了背景透明效果的布局文件。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:background="#B0000000"
             android:gravity="center"
             android:paddingTop="8dp"
             android:paddingBottom="8dp"
             android:paddingLeft="30dp"
             android:paddingRight="30dp" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FFFFFF"/>

</FrameLayout>

创建自定义Toast类

创建一个自定义的Toast类MyToast,类的实现非常简单,就参照Toast类,定义一个makeText()的静态方法和show()方法即可。在makeText()方法内,通过Toast类的setView()方法来为其设置自定义的布局。Toast类的其他方法,如setGravity()可以根据需要来添加。代码如下。

public class MyToast {
    private Toast mToast;
    private MyToast(Context context, CharSequence text, int duration) {
        View v = LayoutInflater.from(context).inflate(R.layout.eplay_toast, null);
        TextView textView = (TextView) v.findViewById(R.id.textView1);
        textView.setText(text);
        mToast = new Toast(context);
        mToast.setDuration(duration);
        mToast.setView(v);
    }

    public static MyToast makeText(Context context, CharSequence text, int duration) {
        return new MyToast(context, text, duration);
    }
    public void show() {
        if (mToast != null) {
            mToast.show();
        }
    }
    public void setGravity(int gravity, int xOffset, int yOffset) {
        if (mToast != null) {
            mToast.setGravity(gravity, xOffset, yOffset);
        }
    }
}

使用自定义Toast类

使用自定义的Toast类方法也非常简单,只需要将原先的Toast改为MyToast即可。

MyToast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();

使用上述例子中的布局效果见下图。
白色背景下的效果 这里写图片描述
有图片背景下的效果 这里写图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页