Android开发中Toast控件的使用详解
Android开发中Toast控件的使用详解
Toast是Android系统中常用的轻量级提示控件,用于在屏幕上显示简短的消息提示。它不会获得焦点,也不会打断用户的操作,几秒钟后会自动消失。本文将详细介绍Toast的各种使用方法,包括常规用法、位置设置、自定义Toast以及修改原生Toast样式等。
常规用法
Toast的基本使用非常简单,通过Toast.makeText()
方法创建一个Toast对象,然后调用show()
方法显示出来。
Toast.makeText(MainActivity.this, "提示的内容", Toast.LENGTH_LONG).show();
// Toast.makeText()只是创建出来一个Toast对象,后面需要接上show()方法才能展示出来
// makeText()方法参数:第一个是上下文对象, 第二个是显示的内容,第三个是显示的时间长短,只有LONG和SHORT两个值可选
位置设置
默认情况下,Toast会显示在屏幕的底部中央。但是我们可以通过setGravity()
方法来改变它的显示位置。
Toast toast = Toast.makeText(MainActivity.this, "test -- ", Toast.LENGTH_SHORT);
//设置gravity属性,以改变默认位置
toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 0, 0);
toast.show();
其中Gravity
表示重力值,常见的有四个值:TOP
、BOTTOM
、LEFT
(较新的API中为START
)、RIGHT
(较新的API中为END
);分别对应屏幕的上下左右边缘。后面两个参数是xOffset
和 yOffset
,表示相对于边缘的偏移量。
注意:在API>=30时,setGravity()
方法的使用受到了限制。当targetSdk>=30
时,针对text toast(即使用Toast.makeText()
创建出来的默认Toast),setGravity()
方法将不会有任何效果,但是自定义的Toast不受影响。
自定义Toast
如果默认的Toast样式和位置都不能满足需求,我们可以创建一个自定义的Toast布局。
自定义Toast布局
首先创建一个自定义的布局文件view_toast_custom.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
使用自定义布局创建Toast
在MainActivity.java
中使用自定义布局创建Toast:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_show).setOnClickListener(view -> customerToast());
}
private void customerToast() {
LayoutInflater inflater = getLayoutInflater();
// 加载自定义布局
View view = inflater.inflate(R.layout.view_toast_custom, null);
ImageView imgLogo = view.findViewById(R.id.iv_logo);
TextView tvMsg = (TextView) view.findViewById(R.id.tv_msg);
imgLogo.setImageResource(R.mipmap.ic_launcher);
tvMsg.setText("customer toast");
// 创建一个Toast对象,传递当前Context上下文即可
Toast toast = new Toast(this);
// 设定Toast位置居中
toast.setGravity(Gravity.CENTER, 0, 0);
// 设定显式时间长短
toast.setDuration(Toast.LENGTH_LONG);
// 通过setView()方法来设定Toast的View
toast.setView(view);
// 显式自定义Toast
toast.show();
}
}
注意:当targetSdk>=30
时,setView()
方法已经被标记为弃用,建议使用Snackbar作为替代方案。
修改Toast原生样式
有时候我们不想完全自定义一个新的Toast,只是想修改Toast文字的颜色或者字体。这时可以在原生Toast样式上做修改。
查看原生Toast布局
原生Toast的布局代码如下:
从Toast布局中可以看到,TextView的id是message
,所以我们可以通过id获取TextView对象,从而做修改:
// SDK targetVersion为29
private void testDefaultToast(){
// 创建一个Toast对象
Toast toast = Toast.makeText(this,"xxxx", Toast.LENGTH_SHORT);
// 通过id获取TextView对象
TextView textView = toast.getView().findViewById(android.R.id.message);
Log.d(TAG, "testDefaultToast: " + textView.getText().toString());
// 设置TextView的颜色
textView.setTextColor(Color.RED);
// 设置字体为粗体
Typeface typeface = Typeface.create("sans-serif-condensed", Typeface.BOLD);
textView.setTypeface(typeface);
// 设置Toast位置在顶部
toast.setGravity(Gravity.TOP,0 ,0);
// 显式Toast
toast.show();
}
注意:在API>=30时,创建Toast对象时,如果没有事先调用setView()
传入一个非空的View,那么在下面使用getView()
方法时,将不能获取Toast对象里的View,而是会返回null。所以如果targetSdk>=30
时,是无法通过getView()
获取原生Toast的View来进行自定义修改的。
如果将上面的代码在targetSdk>=30
中运行,那么在这行的位置将会报错:
// 在这里会空指针异常,因为toast.getView()返回的是null
TextView textView = toast.getView().findViewById(android.R.id.message);