Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android UI學習 - 用戶通知

Android UI學習 - 用戶通知

編輯:Android開發實例

    本文是在網上的文章《Android開發指南-用戶界面-用戶通知》的基礎上添加內容的。裡面的相同內容,版權歸原翻譯作者所有。

通知用戶Notifying the User

    某些情況下需要通知用戶你的應用程序中發生了一個事件。一些事件請求用戶應答而另外一些則不需要。比如:

  • 當一個事件比如保存文件結束時,應該出現一條消息確認保存成功。(Toast適用)
  • 如果一個後台運行的應用程序需要用戶關注,這個應用程序應該創建一個通知來允許用戶在方便時進行應答。(後台程序,狀態欄通知適用)
  • 如果這個應用程序在執行一個用戶必須等待的任務(比如加載一個文件),那麼應用程序應該顯示一個盤旋的進度輪或進度條。(進度條Dialog適用)

    所有這些通知任務可以通過一個不同的技術獲取到:

  • 一個消息條通知Toast Notification, 用於從後台出現的簡短信息。for brief messages that come from the background.
  • 一個狀態條通知A Status Bar Notification, 用於來自後台的持續提醒並請求用戶應答
  • 個對話框通知A Dialog Notification, 用於活動相關的通知
 

消息條通知Toast Notification

    一個消息條通知是一個在窗口表面彈出的信息。它只填充內容所需的空間並且用戶當前活動仍然保持可見和可交互。這個通知自動漸入漸出,而且不接受交互事件。因為消息條可以從一個後台服務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(); //顯示出來
自定義Toast

而如果想使用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。

狀態條通知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);
清除通知Clear

    如果需要把Notification清除(clear),則調用NotificationManager.cancel(Notification的ID),或者直接NotificationManager.clearAll()清除所有。也可以添加Notification對象的FLAG_AUTO_CANCEL屬性來自動清除。

更新通知Update the notification

    可以通過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);
自定義view的Notification

首先定義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

 

對話框通知Dialog Notification

    一個對話框通常是出現在當前活動前面的一個小窗口。背後的活動丟失焦點而由這個對話框接受所有的用戶交互。對話框通常用做和運行中應用程序直接相關的通知和短暫活動。

    你應該使用對話框來顯示一個進度條或者一個需要用戶確認的短消息(比如帶有“確認”和“取消”按鈕的一個警告)。你也可以把對話框作為構成應用程序界面整體的組件以及用於除了通知之外的其它目的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved