简介
Toast是一个弹出消息,他可以快速地响应用户的一些事件。例如保存配置到SD卡。
Toast不管用户在后台跟Activity进行交互还是已经返回到在主界面,它始终可以把消息显示出来。并且用户无法使用按键"返回"键或其他的方式来取消Toast消息。消息会以淡进淡出的方式进行显示。消息显示的时间可以以程序的方式进行设置。大部分情况,Toast是一个短消息,但是你可以给它创建一个自定义View。例如单词后面加个图片。Toast在屏幕中的位置也可以自由地进行控制。Toast可以从Activity或在Service中进行创建。如果一个Toast在Service中进行创建,它会显示在Activity的前面,焦点已经聚焦到它身上,或主界面的上面。
创建一个标准Toast
一个标准Toast会通过调用静态makeText()方法进行创建。
Toast.makeText(getApplicationContext(), "Hello, The Code Project!",
Toast.LENGTH_SHORT).show();
参数为应用的上下文对象,消息本身及Toast的显示时间。你可以通过直接设置Text值方式或直接饮用已经保存的String的方式进行显示。在我们的用例当中,R.String.hello_codeproject资源包含"Hello, The Code Project!"字符串。显示时间为LENGTH_SHORT或LENGTH_LONG。通常默认设置为短消息。你可以以程序的方式通过调用setDuration方法给他定义显示时间。
makeText()方法的背后逻辑很简单:一个Toast对象创建并且设置了字符串及显示时间。然后,你可以调用show()方法对刚刚创建的Toast进行显示,或设置一些额外的属性,例如它在屏幕中的位置或设置一个自定义View给它。新创建的Toast如下图进行显示。
设置Toast在屏幕中的位置
你可以设置Toast在屏幕中的位置通过调用 setGravity方法
Toast toast = Toast.makeText(getApplicationContext(),
"Hello, The Code Project!", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
第一个参数通常用来设置自己的Gravity。第二个和第三个参数定义它相对于第一个参数的偏移量。上述代码的执行结果如下图:
添加一个图片到标准Toast
为了添加一个图片到标准Toast,你必须创建一个ImageView对象,然后从资源中使用setImageResource方法设置它的图片。然后你要获取标准view(实际上市一个LinearLayout)和添加新创建的ImageView对象给它。你要插入的位置可以进行设置(本例子中使用的是0,所以图片会在文字的上面进行显示)。代码如下
Toast toast = Toast.makeText(getApplicationContext(),
"Hello, The Code Project!", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
LinearLayout toastView = (LinearLayout) toast.getView();
ImageView imageCodeProject = new ImageView(getApplicationContext());
imageCodeProject.setImageResource(R.drawable.codeprojectlogo);
toastView.addView(imageCodeProject, 0);
toast.show();
显示的效果为:
通过自定义Layout创建Toast
为了创建自定义Layout的Toast,我们需要先创建自定义Layout,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:background="#ffffffff" android:orientation="vertical"
android:id="@+id/llToast" >
<TextView
android:layout_height="wrap_content"
android:layout_margin="1dip"
android:textColor="#ffffffff"
android:layout_width="fill_parent"
android:gravity="center"
android:background="#bb000000"
android:id="@+id/tvTitleToast" />
<LinearLayout
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/llToastContent"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginBottom="1dip"
android:layout_width="wrap_content"
android:padding="15dip"
android:background="#44000000" >
<ImageView
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:id="@+id/tvImageToast" />
<TextView
android:layout_height="wrap_content"
android:paddingRight="10dip"
android:paddingLeft="10dip"
android:layout_width="wrap_content"
android:gravity="center"
android:textColor="#ff000000"
android:id="@+id/tvTextToast" />
</LinearLayout>
</LinearLayout>
我们创建的Toast看起来像一个Dialog,它拥有头部,图片及消息。我们现在需要当创建Toast.的时候设置该Layout。我们也可以设置对话框的标题,消息字符串及图片。下面就是我们做的一些工作:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.customtoast,
(ViewGroup) findViewById(R.id.llToast));
ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
image.setImageResource(R.drawable.codeprojectlogo);
TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);
title.setText("Attention");
TextView text = (TextView) layout.findViewById(R.id.tvTextToast);
text.setText("Hello, The Code Project!");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.RIGHT | Gravity.TOP, 12, 40);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
最初的两行我们通过解析XML文件(我们使用了LayoutInflater类的实例,通过getLayoutInflater返回)初始化了View对象。第一个参数为Layout的id- R.layout.customToast(它跟 res/layout/customtoast.xml 文件匹配)。然后我们获取了Image的引用,头部标题及消息文本,然后以适当的数据填充他们。最终,我们创建了Toast本身,设置了所有需要的参数及布局(在这里使用了setView方法)。结果我们获得的Toast的显示效果为:
从别的线程创建Toast
为了从别的线程创建Toast,我们需要定义一个Handler属性到我们页面
Handler handler = new Handler();
现在假设你拥有一个线程,在这里你要调用方法显示Toast
new Thread(new Runnable() {
public void run() {
showToast();
}
}).start();
在这里,该方法在另一个线程中执行。但是因为Toast只能在主线程当中进行显示,你尝试着运行的话会获得一个错误消息。
如果你在主线程中执行,然后从别的线程中进行调用,你需要Handler。你可以从新创建的Thread中显示Toast,代码为:
public void showToast() {
handler.post(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
"Hello, The Code Project!", Toast.LENGTH_SHORT).show();
}
});
}