一、通常的用法
Context context = getApplicationContext();
CharSequence text = "Hello,World!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
toast.show();
不过呢,这是拆分式的,一般情况下一句代码:
Toast.makeText(getApplicationContext(), "Hello,World!", Toast.LENGTH_SHORT).show();
不过呢,这一般是显示在屏幕中部靠下的位置,如果要靠左靠右如何操作:
Toast toast = Toast.makeText(getApplicationContext(), "Hello,World!", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.LEFT | Gravity.BOTTOM, 0, 0);
toast.show();
二、位置选择
其中toast.setGravity()这个方法里的三个参数的意思是这样子,贴出源码:public void setGravity(int gravity, int xOffset, int yOffset) {
mTN.mGravity = gravity;
mTN.mX = xOffset;
mTN.mY = yOffset;
}
第一个,位置,第二个,x方向offset,第三个,y方向的offset;
其中第一个参数位置的值有8个,分别是:
Gravity.LEFT,Gravity.RIGHT,Gravity.BOTTOM,Gravity.TOP 加上
Gravity.LEFT | Gravity.TOP,Gravity.LEFT | BOTTOM,Gravity.RIGHT | Gravity.TOP,Gravity.RIGHT | Gravity.BOTTOM
他们的位置如下:
其中,前四者,上下左右,分别是红色标识的1,后四者,左上,左下,右上,右下的位置分别是绿色表示的2;
然后第二个参数,是x方向的偏移量,第三个参数,是y方向的偏移量;
在前四者中:
x、y如为正数,则往右下方向移动,如为负数,则往左上方向移动
在后四者中:x、y只能为正数,不能为负数(负数设置了也没用),正数的意思则是,往屏幕正中心的方向移动,
就是上面这张图片,字符串MainActivity所在的那个位置。
三、自定义Toast
普通的这种写法,只能让我们显示一个字符串,但是我要显示其他东西呢,比如,图片?嗯,这个时候自定义布局呗,代码如下:
LayoutInflater inflater = getLayoutInflater();
View convertView = inflater.inflate(R.layout.layout_toast, null);
TextView textView = convertView.findViewById(R.id.text);
textView.setText(message);
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.LEFT|Gravity.BOTTOM, 200, 200);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(convertView);
toast.show();
然后看效果:
嗯,就是左下角这个位置,x、y方向都移了200,200什么呢,什么单位呢,当然是px,像素了,在哪找到的呢,源码如下:
/**
* Return the X offset in pixels to apply to the gravity's location.
*/
public int getXOffset() {
return mTN.mX;
}
/**
* Return the Y offset in pixels to apply to the gravity's location.
*/
public int getYOffset() {
return mTN.mY;
}
这个mTN.mX与mTN.mY是什么东西,上面贴出过一份源码,xOffset与yOffset设置进来就给了它们两,
上一份源码没有注释,在这一份源码中看到了注释:Returen the X offset in pixels ......pixels,没错,就是
像素,所以就是移了200像素。
当然代码就不用解释了,很简单,通俗易懂,就是自己定义了一个layout_toast.xml而已,局部一个图片一个TextView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_toast_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_background_toast"
android:orientation="horizontal"
android:padding="8dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FFF" />
</LinearLayout>
上面有一个textView.setText(message)这个message是外界传进来的,当然也可以直接“Hello,World!”也是没问题的
四、最后Notice
如果,有自己的layout,就用setView(convertView),如果没有自己的layout,就不要去new Toast(getApplicationContext()),直接用
makeText(context,string,int)去创建Toast。