Android第一天——Toast也可以玩的有模有样

    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哈哈~

猜你喜欢

转载自blog.csdn.net/tangjie134/article/details/79497157