首页 > 代码库 > 通知(Toast+Notification)
通知(Toast+Notification)
Toast简要说明:(前面已经用过好多次了)
- Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图。
- 它不阻断用户的操作,一般用于显示一些不重要的信息。(比方说设置音量的那个提示)
- Toast类可以用于创建和显示toast信息,toast一般翻译为吐司。
常用方法:(有set方法,也有get方法)
- Toast.makeText(context, text, duration); //返回Toast对象
- toast.setDuration(duration); //设置持续时间
- toast.setGravity(gravity, xOffset, yOffset); //设置toast位置,后面的位置偏移参照物是gravity(center/center_horizontal/center_vertical/Bottomd等)
- toast.setText(s); //设置提示内容
- toast.show(); //显示
代码演示一下:
1. 改变位置
后面两个是偏移量,是根据前面一个gravity参数来指定的。
2. toast显示图片
MainActivity.java
public class MainActivity extends Activity implements OnClickListener{ private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn1); btn.setOnClickListener(this); } @Override public void onClick(View v) { Toast toast = Toast.makeText(this, "带有图片的toast", Toast.LENGTH_LONG); LinearLayout toast_layout = (LinearLayout) toast.getView(); ImageView iv = new ImageView(this); iv.setImageResource(R.drawable.ic_launcher); toast_layout.addView(iv); //再当前布局中加入一个iamgeview //toast_layout.addView(iv,0);则是指定线性布局中的索引 toast.show(); }}
(布局文件就只有一个Button控件)
点击按钮,则出现下列情况。
3. 完全自定义的toast
先要去定义一个布局文件toastlayout.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher"/> <TextView android:layout_width="match_parent" android:layout_height="30dp" android:gravity="center" android:text="这个是自定义布局的toast"/></LinearLayout>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.toastytest.MainActivity" > <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示toast" /></RelativeLayout>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener{ private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn1); btn.setOnClickListener(this); } @Override public void onClick(View v) { //为控件指定布局 LayoutInflater inflater = LayoutInflater.from(this); View toast_view = inflater.inflate(R.layout.toastlayout, null); Toast toast = new Toast(this); toast.setView(toast_view); toast.show(); }}
点击效果如下:
(toast的用法,一般就是简单的提示作用)
Notification简要说明:
- 在设备的状态栏(通知栏)中显示
- 显示一条持久化信息
- 用到Notification和NotificationManager类
在这里,必须要分清3种情况:
- 其他应用程序在使用时,突然在通知栏中显示一条Notification
- 下拉状态栏,Notification显示一些详细信息
- 点击Notification,有相应的应用程序或者activity被激活
下面用代码演示一下:
新建一个活动NotificationView.java (一会儿点击“下拉状态栏”里面的notification时,就跳转这个activity)
public class NotificationView extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification); //点击notification后,在状态栏取消notification NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.cancel(getIntent().getExtras().getInt("notificationID")); }}
其指定布局为 notification.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="这里是notification的详细信息" /></LinearLayout>
当然还要注册activity—AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.VIBRATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NotificationView" android:label="Details of notification" > <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application></manifest>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener{ private int notificationID = 1; //用于被激活的activity去销毁notification @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(this); } @Override public void onClick(View v) { displayNotification(); } private void displayNotification() { Intent i = new Intent(this,NotificationView.class); i.putExtra("notificationID", notificationID); //PendingIntent 可以让应用程序在后面某个时刻执行一个动作,而不考虑应用程序是否在运行 //PendingIntent android.app.PendingIntent.getActivity(Context context, // int requestCode, Intent intent, int flags) flags是活动启动时的标志 //点击了下拉的notification时,启动一个指定活动 PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,0); NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //没有下拉时显示的notification Notification notif = new Notification( R.drawable.ic_launcher, "还有没下拉时的信息", System.currentTimeMillis());//发送时间 //下拉时,显示Notification的信息 notif.setLatestEventInfo(this, "下拉时", "详细信息是", pendingIntent); notif.vibrate = new long[]{100,250,100,500}; //发出震动 nm.notify(notificationID,notif); }}
主布局里面就一个button
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示一条通知" /></RelativeLayout>
赶快来看看效果:
点击按钮、
下拉状态栏:
点击该下拉状态栏中的notification
(立刻就跳转到了新的activity)
小结:
- 突然显示了一条notification提示:Notification notif = new Notification( R.drawable.ic_launcher, "还有没下拉时的信息", System.currentTimeMillis());
- 下拉显示,需要用到NotificationManager:
- 点击下拉的状态栏里面的notification时,跳转:
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//下拉时,显示Notification的信息
notif.setLatestEventInfo(this, "下拉时", "详细信息是", pendingIntent);
notif.vibrate = new long[]{100,250,100,500}; //发出震动
nm.notify(notificationID,notif);
Intent i = new Intent(this,NotificationView.class);
i.putExtra("notificationID", notificationID);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,0);
实际上显示和取消通知栏都是NotificationManager在起作用:
notify(id, notification);
cancel(id);
构造Notification的时候,如果有初始化,那么就是最开始没有下拉时显示的状况了。
通知栏可以设置,提示音,指示灯,以及震动效果.
上面的代码,构建Notification对象的方法其实已经过时了,现在用的比较多的是Builder对象
Builder builder = new Notification.Builder(this);builder.setSmallIcon(R.drawable.ic_launcher); //设置图标builder.setTicker("没有下拉时显示的一个消息");builder.setWhen(System.currentTimeMills()); //设置时间builder.setContentTitle("下拉时标题");builder.setContentText("下拉时详细信息");PendingIntent pIntent = PendingIntent.getActivity(this,0,new Intent("com.example.NotificationView"),0);builder.setContentIntent(pIntent); //点击后跳转builder.setDefaults(Notification.DEFAULT_LIGHTS); //设置指示灯Notification notif = builder.build(); //4.1及以上版本//builder.getNotification(); //4.1以下版本
其中:
builder.setDefaults();
可以传入:
Notification.DEFAULT_SOUND;
Notification.DEFAULT_LIGHTS;
Notification.DEFAULT_VIBRATE;
或者设置一条:(相当于以上三条)
Notification.DEFUALT_ALL;
通知(Toast+Notification)