Android中Toast是我们最常用的一个组建, 但是一般开发的用法都是如下:
Toast.makeText(context, text, duration).show();
Toast.makeText(context, text, duration).show();
这是最常用的, 但是, 当这个Toast显示的时候, 另一个Toast又来了, 那么第二个Toast必须要等第一个Toast消失之后才能显示, 这就有延时了, 那么下面讲的方法就是, 当第一个还没消失的时候, 第二个立即显示出来.
Toast.makeText是一个静态工厂方法,每次调用这个方法都会产生一个新的Toast对象,在这个对象上调用show方法就会使这个对象加入到消息显示的队列里排队等候显示。实际上,如果我们不每次都产生一个新的toast对象,而是每一次都是用同一个,那么就不需要排队了,我们要的及时更新效果也就可以实现了。
实际上,我们可以使用Toast本身的构造器产生一个新的Toast对象,并用setText和setDuration方法来达到和makeText同样的设置,之后也一样用show方法来显示。这样就把makeText方法产生对象和设置属性的操作分开来进行。也就是说,我们显示下一个toast的时候,可以不必再产生新对象,只要在原来的对象上重新设置属性,并重新show就可以了,这样新的toast就会代替原来的马上显示。
在实际中, 我们把Toast放到全局环境中, 然后整个项目里面都用这一个Toast, 这样就确保了所有的Toast都是通过这一个view来显示的, 下面代码给出了一个Toast管理器的单例实现, 用一个enum就可以了.
OK,分析完了, 那么就上代码吧.
package com.gdut.pet.common.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
public enum toastMgr {
builder;
private View v;
private Toast it;
private void init(Context c) {
LayoutInflater inflate =(LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = Toast.makeText(c, "", Toast.LENGTH_SHORT).getView();
it = new Toast(c);
it.setView(v);
}
public void display(CharSequence text, int duration) {
it.setText(text);
it.setDuration(duration);
it.show();
}
public void display(int Resid, int duration) {
it.setText(Resid);
it.setDuration(duration);
it.show();
}
}
package com.gdut.pet.common.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
public enum toastMgr {
builder;
private View v;
private Toast it;
private void init(Context c) {
LayoutInflater inflate =(LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = Toast.makeText(c, "", Toast.LENGTH_SHORT).getView();
it = new Toast(c);
it.setView(v);
}
public void display(CharSequence text, int duration) {
it.setText(text);
it.setDuration(duration);
it.show();
}
public void display(int Resid, int duration) {
it.setText(Resid);
it.setDuration(duration);
it.show();
}
}
然后在application底下去初始化这个Toast
public class MyApplication extends Application
{
private static final String TAG = "application";
@Override
public void onCreate()
{
//TODO Auto-generated method stub
super.onCreate();
L.i(TAG, "oncreate");
//这样就可以了 在其他activity中就可以使用了
toastMgr.builder.init(getApplicationContext());
}
}
public class MyApplication extends Application
{
private static final String TAG = "application";
@Override
public void onCreate()
{
//TODO Auto-generated method stub
super.onCreate();
L.i(TAG, "oncreate");
//这样就可以了 在其他activity中就可以使用了
toastMgr.builder.init(getApplicationContext());
}
}
这样就可以了 在其他activity中就可以使用了, 这样第二个toast就会立即显示出来了