这一讲我们来学习一下 Android中的通知[Notifications],这里我们学习 Notifications 的内容主要是以Android 低版本的介绍文档来学习,当然在最新版本中Android已经将Notifications中的Toast分离出来作为单独的模块讲解,这一讲我们就先来学习一下Android中Toast的用法,下一讲中我们讲会学习Android中Notifications的Status Bar Notification 用法[重点]
1. Android中的 Notifications
查看Android官方文档,通知的说明
在您的应用程序,可能会发生多种类型的情况下,这就需要你对这些事件发生对用户进行通知。有些时间需要与用户进行交互,得到用户的响应,而有些时间则不需要。比如说:
1). 文件保存成功,就需要出现一条信息来确认文件已经成功保存。
2). 如果应用程序在后台运行而且需要引起用户的注意,应用程序就应该创建一条通知让用户能够方便的做出相应。
3). 如果应用程序正在工作,此时需要用户等待(比如加载一个文件),应用程序应该显示 悬浮的 progress 或者 bar 组件之类的。
可以知道Android中的通知的方式有三种:
1). Toast Notification 来自后台的简短的通知2). Status Bar Notification 来自后台的比较持久的提醒而且需要得到用户的响应。3). Dialog Notification 与Activity相关的对话框的通知 [这种形式建议参考之前所讲的 Android中UI之对话框的操作]
2. Toast Notification
这种通知是显示在窗体的最上层,它只显示在当前Activity的有限空间内,不影响当前Activity可见与可交互。 这种通知会自动的弹出和自动消失,不会接受交互事件,仅仅是一种提示作用。因为它的创建是来自后台的 Activity 或者 Service. 即使是应用程序不可见它也会发生。
如果你创建了一个 Toast Notification 是来自Service的,它就会显示在当前获得焦点的 Activity的前面。如果用户想用对通知做出相应,应该考虑使用 Status Bar Notification。
如果你创建了一个 Toast Notification 是来自Service的,它就会显示在当前获得焦点的 Activity的前面。如果用户想用对通知做出相应,应该考虑使用 Status Bar Notification。
1). 使用步骤
首先,通过makeText()方法来实例化一个 Toast 对象。方法说明如下
public static Toast makeText (Context context, int resId, int duration)这个方法需要三个参数:它返回一个Toast对象,通过调用show()方法来显示通知。context: 上下文对象resId: 信息内容[以R.string 方式来显示最好]duration: 显示时间
使用方法如下程序所示:
2). 显示你通知的位置以上这种方法是大多数 Toast Notification 的使用方式,当然你也可以自己定制化你的通知。Context context = getApplicationContext(); CharSequence text = "Hello toast!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show();
标准的通知一般是显示在屏幕的正下方,当然你可以通过调用 setGravity(int, int, int) 方法来调整通知显示的位置,它接受三个参数。public void setGravity (int gravity, int xOffset, int yOffset)gravity : Gravity 常量xOffset : x轴偏移量yOffset : y轴偏移量例如:显示通知位置在左上角,你可以设置如下 :toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);你也可以通过设置后面两个参数的偏移量来调整通知在左上角的偏移位置3). 自定义通知
创建一个自定义的布局,可以在XML中定义,也可以在代码中定义,然后调用 setView(View) 方法将 view 对象加载进来即可。
这边用LayoutInflate的 inflate() 来动态加载布局,这种方式 在前面的 【Android 开发】之 UI组件那些文章已经讲的很清楚了,这里不做概述,不懂的学友可以去翻翻之前写的博客就明白了。
3. 代码实现
1) 布局文件 activity_main.xml 这里就不贴出来了,只是定义了两个按钮
2) toast_layout.xml 自定义布局文件
3) 程序主代码<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toast_layout_root" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#DAAA" android:orientation="horizontal" android:padding="8dp" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="8dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" /> </LinearLayout>
package com.android.toastdemo; import android.os.Bundle; import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private Button button; private Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initComponent(); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast toast = Toast.makeText(MainActivity.this, "Hello AHuier", Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); // Toast 居中显示 toast.show(); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /* * 动态加载布局第一种写法 View view = LayoutInflater.from(MainActivity.this) .inflate(R.layout.toast_layout, null);*/ //动态加载布局 LayoutInflater inflate = getLayoutInflater(); View layout = inflate.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root)); TextView textView = (TextView) layout.findViewById(R.id.text); textView.setText("This is a custom toast"); Toast toast = new Toast(MainActivity.this); toast.setGravity(Gravity.CENTER, 0, 0); toast.setDuration(Toast.LENGTH_LONG); //toast.setView(view); //加载布局第一种写法 toast.setView(layout); //加载布局 toast.show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void initComponent() { button = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); } }
4. 程序执行结果
一般在做开发过程中,为了统一UI风格,往往定义自定义通知,或者自定义的对话框的这种风格会重复出现,为了避免代码冗余,可以声明在一个类中,可以反复使用。
详情参考 :Android官方文档 Toast 模块介绍