问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android开发中Toast控件的使用详解

创作时间:
作者:
@小白创作中心

Android开发中Toast控件的使用详解

引用
CSDN
1.
https://blog.csdn.net/qq_44458837/article/details/140389859

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表示重力值,常见的有四个值:TOPBOTTOMLEFT(较新的API中为START)、RIGHT(较新的API中为END);分别对应屏幕的上下左右边缘。后面两个参数是xOffsetyOffset ,表示相对于边缘的偏移量。

注意:在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);
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号