編輯:Android開發實例
本文是在網上的文章《Android開發指南-用戶界面-用戶通知》的基礎上添加內容的。裡面的相同內容,版權歸原翻譯作者所有。
某些情況下需要通知用戶你的應用程序中發生了一個事件。一些事件請求用戶應答而另外一些則不需要。比如:
所有這些通知任務可以通過一個不同的技術獲取到:
一個消息條通知是一個在窗口表面彈出的信息。它只填充內容所需的空間並且用戶當前活動仍然保持可見和可交互。這個通知自動漸入漸出,而且不接受交互事件。因為消息條可以從一個後台服務Service中創建,即便應用程序不可見,它也將呈現出來。
默認的Toast 自定義的Toast
Toast的創建和顯示都很簡單,如果不使用自定義的view,只是顯示文字,makeText函數就能做到了:
Toast.makeText(getApplicationContext(), // Context context
"This is a simple toast!", //顯示的text或者引用resource.string的id
Toast.LENGTH_LONG) //顯示的時間長度,
//LENGTH_LONG - 時間長些,>1s;
//LENGTH_SHORT- 時間短
.show(); //顯示出來
而如果想使用custom view,首先要寫個custom Layout xml文件(toastlayout.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:background="#DAAA"
>
<ImageView
android:id="@+id/toast_icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="10dp"
android:src="@drawable/icon"
/>
<TextView
android:id="@+id/toast_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#FFF"
/>
</LinearLayout>
注意: TextView的layout_height設置為wrap_content的話,發現左邊的圖片會跟隨文字內容的高度而變化,就是說當文字只有一行的時候,圖片的高度就變得只有一行的高度,不好看!圖片的src可以不在xml文件裡面定義,可以在真正顯示時用以下語句來設置:
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
以下是顯示custom toast view:
//加載Layout
View view = getLayoutInflater().inflate(
R.layout.toastlayout, //resource id
(ViewGroup) findViewById(R.id.toast_layout)); //ViewGroup對象
//設置Text
((TextView) view.findViewById(R.id.toast_text))
.setText("This is a custom toast!");
//創建Toast
Toast toast = new Toast(getApplicationContext());
// 設置顯示的位置
toast.setGravity(
Gravity.CENTER_VERTICAL, //垂直居中
0, //xOffset
0 //yOffset
);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(view); // ** 這個很重要
toast.show();
** 官方提示:只有使用custom view,setView(View)的時候,才使用new Toast(Content content)來得到Toast對象,否則必須用makeText(Context, int, int)方法來創建toast對象。
消息條Toast是用來顯示簡短文本信息的最好方法,比如“文件已保存”,當你很確信用戶正在關注屏幕時。一個消息條不能接受用戶交互事件;如果你希望用戶應答並采取相應動作,請考慮使用一個狀態條通知Status Bar Notification。
一個狀態條通知添加一個圖標到系統狀態欄上(以及一個可選的滾動條文本信息)以及在這個“通知”窗口中的一個擴展消息。當用戶選擇這個擴展消息時,Android發出這個通知所定義的一個意圖(通常是啟動一個活動)。你也可以配置這個通知來通過一個聲音,震動和設備上的閃爍燈來警告用戶。
當你的應用程序以後台服務運行並需要通知用戶事件時,這類通知是一個理想的方式。如果你需要在活動仍處於焦點下時警告用戶一個發生的事件,請考慮使用對話框通知Dialog Notification 。
自定義View和默認的Notification
狀態欄Notification的創建流程大概是這樣的:
// 獲取NotificationManager
mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 創建PendingIntent, 明確響應後轉向的Activity
contentIntent = PendingIntent.getActivity(
getApplicationContext(),
0,
new Intent(getApplicationContext(),
FrameDemo.class), //響應Notification轉向的Activity
0);
//實例化一個Notification,並指定其圖標和標題(在提示欄上顯示)
mNotification = new Notification(
R.drawable.icon, // icon
"Notification", // 狀態欄上顯示的滾動提示文字tickerText
System.currentTimeMillis());//Notification計劃執行的開始時間
//設置Notification的Title和詳細內容(打開提示欄後在通知列表中顯示)
mNotification.setLatestEventInfo(
getApplicationContext(),
"Notification open", // Title
"This is a simple notification", //content
contentIntent); //PendingIntent是在這時候用的
//100 毫秒延遲後,震動 250 毫秒,暫停 100 毫秒後,再震動 500 毫秒
mNotification.vibrate = new long[] { 100, 250, 100, 500 };
//mNotification.defaults |= Notification.DEFAULT_VIBRATE; //或者設置默認的震動效果
//設置閃燈綠光,也可以設置默認的效果,請參考API DOC
mNotification.ledARGB = 0xff00ff00;
mNotification.ledOnMS = 300;
mNotification.ledOffMS = 1000;
mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
//設置聲音,可以選擇以下任一方式,但要注意,當defaults已經包含了DEFAULT_SOUND,將覆蓋之前指定的音頻文件的設置
mNotification.defaults |= Notification.DEFAULT_SOUND; //系統默認的通知聲音
//mNotification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); //或者指定某個音頻文件
//設置聲音持續重復,直至用戶點擊或者清除通知
mNotification.flags |= Notification.FLAG_INSISTENT;
//最後一步: NotificationManager發出通知
mNotificationManager.notify(
R.id.notice1, //該Notification的ID
mNotification);
如果需要把Notification清除(clear),則調用NotificationManager.cancel(Notification的ID),或者直接NotificationManager.clearAll()清除所有。也可以添加Notification對象的FLAG_AUTO_CANCEL屬性來自動清除。
可以通過notification對象的setLatestEventInfo()方法來修改/更新信息,也可以通過其他函數來修改notification對象的屬性,最後是調用NotificationManager.notify(原來的ID, 修改/更新後的notification對象)完成的。
//修改Title & content
mNotification.setLatestEventInfo(
getApplicationContext(),
"Notification update", // Title
"This is the second notification", //content
contentIntent);
//修改Icon
mNotification.icon = R.drawable.robot;
//設置自動清除
mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
//重新發出通知
mNotificationManager.notify(R.id.notice1, mNotification);
首先定義Layout xml文件(notifylayout.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notify_layout"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dp"
>
<ImageView
android:id="@+id/notify_image"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="10dp"
/>
<TextView
android:id="@+id/notify_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#000"
/>
</LinearLayout>
然後使用RemoteView加載Layout,並設置Image,Text:
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notifylayout);
contentView.setImageViewResource(R.id.notify_image, R.drawable.robot);
contentView.setTextViewText(R.id.notify_text, "Hello, this message is in a custom expanded view");
Notification notification = new Notification(
R.drawable.icon, //icon
"Notification", // 狀態欄上顯示的提示文字
System.currentTimeMillis());
notification.contentIntent = contentIntent;
notification.contentView = contentView; //就是這裡不同,set view
// 以R.layout.notify_layout為ID
mNotificationManager.notify(R.layout.notifylayout, notification);
官方提示,使用custom view的Notification要注意在不同規格的屏幕下的顯示效果。個人認為,Notification的自定義View用途不大。更詳細的內容可以查閱http://androidappdocs.appspot.com/guide/topics/ui/notifiers/notifications.html
一個對話框通常是出現在當前活動前面的一個小窗口。背後的活動丟失焦點而由這個對話框接受所有的用戶交互。對話框通常用做和運行中應用程序直接相關的通知和短暫活動。
你應該使用對話框來顯示一個進度條或者一個需要用戶確認的短消息(比如帶有“確認”和“取消”按鈕的一個警告)。你也可以把對話框作為構成應用程序界面整體的組件以及用於除了通知之外的其它目的。
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
不知道大家是否用過天天動聽,對於它界面上的半透明Menu效果,筆者感覺非常漂亮