1.Toast简介
当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。用户将可能是在中间键入别的东西。Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,Toast会根据用户设置的显示时间后自动消失。
先来看看效果:
2.Toast获取实例方法
类型 | 名称 | 功能 |
构造方法 | Toast(Context context) |
创建一个Toast实例 |
静态 | Toast makeText(Context context, CharSequence text, int duration) |
返回一个Toast实例 |
静态 | Toast makeText(Context context, Looper looper,
CharSequence text, int duration) |
返回一个Toast实例 |
Toast的构造方法创建的Toast没有包含任何视图(View),所以需要添加现有视图才可以显示;
而Toast静态实例方法就会根据你设置的参数,自动生成一个包含textview的布局并且添加到toast实例中去;
context为上下文,text就是我要显示消息,duration时我们的Toast要显示的时长,looper暂时不用管,第一个静态方法也是调用的第二个静态方法,只不过looper参数输入的为null;
参数名 | 值 | 含义 |
LENGTH_SHORT |
0 | toast显示较短的时间后消失(4000ms) |
LENGTH_LONG |
1 | toast显示较长的时间后消失(7000ms) |
3.Toast最简单的使用
Toast.makeText(this,"你好,我叫吐司",Toast.LENGTH_SHORT).show();
如上代码就是实现一个显示短时间的Toast;
4.给Toast中添加一个图片
思路:Toast也是有布局的,那么我们就可以获取它的布局后再添加一个ImageView。
代码如下:(当然也有不同的实现方式)
Toast toast = Toast.makeText(this,"我叫带图片的吐司",Toast.LENGTH_SHORT); LinearLayout layout = (LinearLayout) toast.getView(); layout.setOrientation(LinearLayout.VERTICAL); layout.setGravity(Gravity.CENTER); ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(R.mipmap.ic_launcher); layout.addView(imageView); toast.show();注意事项:在获取布局转换为线性布局后,需要设置布局的排列方向,即Orientation属性
5.让Toast改变显示的位置
使用Tosat自带的方法:
void setGravity(int gravity, int xOffset, int yOffset)
Gravity参数就是我们常说的居中,靠左这些了,每个位置对应的值都在Gravity类里,两个offset参数是确定Toast布局具体偏移的位置,当Toast的Gravity设置为left|top时如下图所示:
Tips:offset所表示的距离与布局的重心有关
6.让Toast只显示图片
方法1:我们回到文章第4部分,但是在
layout.addView(imageView);
之前先将布局清空,代码如下:
Toast toast = Toast.makeText(this,"我叫带图片的吐司",Toast.LENGTH_SHORT); LinearLayout layout = (LinearLayout) toast.getView(); layout.setOrientation(LinearLayout.VERTICAL); layout.setGravity(Gravity.CENTER); ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(R.mipmap.ic_launcher); layout.removeAllViews(); layout.addView(imageView); toast.show();然后运行结果如下:
可以看出只显示图片了,但是原来Toast的背景还在,我们再将背景设置透明,
layout.setBackgroundResource(R.color.TRANSPARENT);
color文件中:
<color name="TRANSPARENT">#00000000</color>
再运行,结果如图:
可以看出背景也没有了,这说明我们可以自定义的Toast布局来实现不同需求。
方式2:新建一个xml布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_toast_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> </LinearLayout>
我们使用静态加载布局的方式来设置Toast的视图,这次不用makeToast,我们使用它的构造方法来创建:
Toast toast = new Toast(this); LinearLayout layout = (LinearLayout) LayoutInflater.from(MainActivity.this) .inflate(R.layout.layout_toast,null); toast.setView(layout); toast.show();
运行后效果如图:
可以看出是和方式1效果是一样的;起始查看下Toast源码就会发现,makeToast也是使用的静态加载布局方法加载的内置布局;
/** * Make a standard toast to display using the specified looper. * If looper is null, Looper.myLooper() is used. * @hide */ public static Toast makeText(@NonNull Context context, @Nullable Looper looper, @NonNull CharSequence text, @Duration int duration) { Toast result = new Toast(context, looper); LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); tv.setText(text); result.mNextView = v; result.mDuration = duration; return result;
看到这里,我想大家已经了解了Toast基本用法和拓展思想了。
奉上我的Demo:MyToast
刚开始写文章,有疑问或错误的地方请大家帮忙指出O(∩_∩)O哈哈~