Toast:一个用户通知

简介

  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();
      }
   });
}

  这些是全部,感谢Timur Dyussebayev的英文文章,链接为:http://www.codeproject.com/Articles/109735/Toast-A-User-Notification#

 

 

posted @ 2012-04-06 17:34  卡马克  阅读(399)  评论(0编辑  收藏  举报