首页 > 代码库 > Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)

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