Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)

      

自定义的Toast类

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button01_id"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示自定义toast" />
    
    <Button
        android:id="@+id/button02_id"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示可以控制显示时间的toast" />
    
    <Button
        android:id="@+id/button03_id"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示由代码创建的toast" />
    
    <Button
        android:id="@+id/button04_id"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="在其他线程中的toast" />
</LinearLayout>

自定义toast的布局界面

toast.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_id"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="200dp"
    android:layout_height="150dp"
    android:background="#000000">
    
    <ImageView 
        android:id="@+id/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/kale"/>
    
    <TextView 
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="toast"
        android:textColor="#FFF"/>
    
</LinearLayout>

myToast.java

package com.kale.toast;

import android.content.Context;
import android.os.Handler;
import android.view.View;
import android.widget.Toast;

/*
 * Toast自定义显示时间
 * 使用方法
 * 1.先初始化类 MyToast myToast = new MyToast(this);
 * 2.显示消息   myToast.setText("要显示的内容");//设置要显示的内容
 *             myToast.show(8000);  //传入消息显示时间,单位毫秒,最少2000毫秒,并且只能是2000的倍数。
 *             传入0时会一直显示,只有调用myToast.cancel();时才会取消。
 * 3.取消消息显示   myToast.cancel();
 * */

public class MyToast {

    private Context mContext = null;
    private Toast mToast = null;
    private Handler mHandler = null;
    private int duration = 0;
    private int currDuration = 0;
    private final int DEFAULT=2000;
    private Runnable mToastThread = new Runnable() {
    
    public void run() {
        mToast.show();
        mHandler.postDelayed(mToastThread, DEFAULT);// 每隔2秒显示一次
        if (duration != 0) {
            if (currDuration <= duration) {
                currDuration += DEFAULT;
            } 
            else {
                cancel();
            }
        }
        
        }
    };
    
    public MyToast(Context context) {
        mContext = context;
        currDuration=DEFAULT;
        mHandler = new Handler(mContext.getMainLooper());
        mToast = Toast.makeText(mContext, "", Toast.LENGTH_LONG);
    }
    
    public void setText(String text) {
        mToast.setText(text);
    }
    
    public void show(int duration) {
        this.duration = duration;
        mHandler.post(mToastThread);
    }
    
    public void setGravity(int gravity, int xOffset, int yOffset){
        mToast.setGravity(gravity, xOffset, yOffset);
    }
    
    public void setDuration(int duration){
        mToast.setDuration(duration);
    }
    
    public void setView(View view){
        mToast.setView(view);
    }
    
    public void cancel( ) {
        mHandler.removeCallbacks(mToastThread);// 先把显示线程删除
        mToast.cancel();// 把最后一个线程的显示效果cancel掉,就一了百了了
        currDuration = DEFAULT;
    }
}

MainActivity.java

package com.kale.toast;

import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    Button btn01,btn02,btn03,btn04;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        viewInit();
        ButtonListener listener = new ButtonListener();
        btn01.setOnClickListener(listener);
        btn02.setOnClickListener(listener);
        btn03.setOnClickListener(listener);
        btn04.setOnClickListener(listener);
        
        
    }
    
    public class ButtonListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO 自动生成的方法存根
            switch (v.getId()) {
            case R.id.button01_id:
                firstToast();
                break;
            case R.id.button02_id:
                secondToast();
                break;
            case R.id.button03_id:
                thirdToast();
                break;
            case R.id.button04_id:
                otherToast();
            default:
                break;
            }
        }
        
    }


    public void firstToast() {
        //获取LayoutInflater对象,该对象能把XML文件转换为与之一直的View对象  
        LayoutInflater inflater = getLayoutInflater();  
        //根据指定的布局文件创建一个具有层级关系的View对象  
        //第二个参数为View对象的根节点,即LinearLayout的ID  
        View layout = inflater.inflate(R.layout.toast, 
                (ViewGroup) findViewById(R.id.toast_layout_id));  
          
        //查找ImageView控件  
        //注意是在layout中查找  
        ImageView image = (ImageView) layout.findViewById(R.id.image);  
        image.setImageResource(R.drawable.kale);  
        TextView text = (TextView) layout.findViewById(R.id.text);  
        text.setText("自定义Toast");  
        
          Toast toast = new Toast(getApplicationContext());
        //设置Toast的显示位置,后两个参数是偏移量
        toast.setGravity(Gravity.CENTER, 0, 100);
        toast.setView(layout);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();
    }
    
    public void secondToast() {
        View view = getLayoutInflater().inflate(R.layout.toast, null);
        MyToast myToast = new MyToast(MainActivity.this);
        myToast.setText("显示时间为8000毫秒");//设置要显示的内容
        myToast.setView(view);
        myToast.show(8000);  //传入消息显示时间,单位毫秒,最少2000毫秒,并且只能是2000的倍数。
    }
    
    public void thirdToast() {
        ImageView image = new ImageView(getApplicationContext());
        image.setImageResource(R.drawable.ic_launcher);
        
        LinearLayout ll = new LinearLayout(getApplicationContext());
        ll.addView(image);
        
        Toast toast = new Toast(getApplicationContext());
        toast.setView(ll);
        toast.setDuration(0);
        toast.show();
    }
    
    public void otherToast() {
        System.out.println("other");
        new Thread(){
            @Override
            public void run() {
                 Looper.prepare();//先移除
                 Toast.makeText(getApplicationContext(),"在其他线程中的toast",Toast.LENGTH_SHORT).show();  
                 Looper.loop();// 进入loop中的循环,查看消息队列
            }
         }.start();

    }

    
    private void viewInit() {
        btn01 = (Button)findViewById(R.id.button01_id);
        btn02 = (Button)findViewById(R.id.button02_id);
        btn03 = (Button)findViewById(R.id.button03_id);
        btn04 = (Button)findViewById(R.id.button04_id);
    }
}

源码下载:http://download.csdn.net/detail/shark0017/7654053

原文地址:https://www.cnblogs.com/tianzhijiexian/p/3855557.html