android之對話框通知欄:

Toast類

Android中的Toast是一種簡易的消息提示框。
Toast是一個包含用戶點擊消息。Toast類會幫助你創建和顯示這些。
當視圖顯示給用戶,在應用程序中顯示爲浮動。和Dialog不一樣的是,它永遠不會獲得焦點,無法被點擊。用戶將可能是在中間鍵入別的東西。Toast類的思想就是儘可能不引人注意,同時還向用戶顯示信息,希望他們看到。而且Toast顯示的時間有限,Toast會根據用戶設置的顯示時間後自動消失。使用這個類的最簡單的方法是調用靜態方法構造您所需要的一切,並返回一個新的Toast對象。
使用靜態方法創建
//靜態方法可以創建一個簡單的Toast

public static Toast makeText(Context context, CharSequence text,
@Duration int duration)
//context 代表上下文
//text 代表需要顯示的文本
//duration 代表顯示的時間,一般使用常量,也可以使用毫秒數。
//#LENGTH_SHORT 短
//#LENGTH_LONG 長

例如
//使用靜態方法創建

Toast toast = Toast.makeText(this,”你好,Toast”,Toast.LENGTH_SHORT);
//將Toast顯示到屏幕上
toast.show();

Toast的默認顯示位置位於屏幕的下方,如果需要改變位置,那麼可以調用Toast的公開方法

public void setGravity(int gravity, int xOffset, int yOffset)
//gravity 顯示的位置,它是一個常量,來自於android.view.Gravity3. //offset 代表X,Y軸的偏移量
使用構造方法創建
Toast也可以使用構造方法去創建,但是必須手動設置視圖( setView )和顯示時間
( setDuration )。
//初始化Toast
Toast toast = new Toast(this);
//設置顯示時間,可以選擇Toast.LENGTH_LONG或者Toast.LENGTH_SHORT
toast.setDuration(Toast.LENGTH_LONG);
//承載一個TextView,用來顯示文字
TextView view = new TextView(this);
//設置TextView的值
view.setText(“這是一個Toast提示”);
//設置TextView的佈局
view.setLayoutParams(new
LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.Layou
tParams.WRAP_CONTENT));
//Toast承載該TextView
toast.setView(view);
//顯示Toast
toast.show();

setView中雖然可以給定很複雜的界面,但是一般Toast只是爲了顯示一些不重要的信息,所
以我們這裏不再演示,如果需要給定重要信息,一般使用Dialog來提示用戶

Dialog類

一個對話框一般是一個出現在當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對
話框接受所有的用戶交互. 對話框一般用於提示信息和與當前應用程序直接相關的小功能.
Android API 支持下列類型的對話框對象:

  • 警告對話框 AlertDialog: 一個可以有0到3個按鈕, 一個單選框或複選框的列表的對話框. 警
    告對話框可以創建大多數的交互界面, 是推薦的類型.
  • 進度對話框 ProgressDialog: 顯示一個進度環或者一個進度條. 由於它是AlertDialog的擴
    展, 所以它也支持按鈕.日期選擇對話框 DatePickerDialog: 讓用戶選擇一個日期.
    時間選擇對話框 TimePickerDialog: 讓用戶選擇一個時間.
    如果你希望自定義你的對話框, 可以擴展Dialog類。
  • 警告對話框(AlertDialog)
    AlertDialog是Dialog的一個直接子類,使用AlertDialog,我們可以顯示一個標題,最多3個按
    鈕操作,以及一組選擇框或者是自己定義的彈出框。
    AlertDialog使用了Builder設計模式來創建對象
    Buileder(生成器)—對象創建型模式

一 意圖

將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

二 適用性

在以下情況使用Build模式:

1 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2 當構造過程必須允許被構造的對象有不同的表示時。
3 Builder模式要解決的也正是這樣的問題:

當我們要創建的對象很複雜的時候(通常是由很多其他的對象組合而成)我們要複雜對象的創建過程和這個對象的表示(展示)分離開來這樣做的好處就是通過一步步的進行復雜對象的構建由於在每一步的構造過程中可以引入參數,使得經過相同的步驟創建最後得到的對象的展示不一樣。
效果:

  • 隱藏產品的內部表示
  • 將構造代碼和表示代碼分開
  • 精確的控制導向產品的創建

這裏寫圖片描述

AlertDialog的設置區域區域1那裏就是定義彈出框的頭部信息,包括標題名或者是一個圖標。

    1. setTitle : 爲對話框設置標題
    1. setIcon : 爲對話框設置圖標

區域2那裏是AlertDialog對話框的content部分,在這裏我們可以設置一些message信息,或
者是定義一組選擇框,還可以定義我們自己的佈局彈出框。

  1. setMessage: 爲對話框設置內容,如果設置了其他內容,那麼Message不要設置
    ,否者只顯示Message
  2. setView: 給對話框設置自定義View
  3. setItems: 設置對話框要顯示的一個list,一般用於顯示幾個命令時
  4. //public Builder setItems(CharSequence[] items, final
    OnClickListener listener)
  5. //items是傳入一個字符串數組,或者是R文件中的數組
  6. //監聽方式在下面介紹
    7.
  7. setSingleChoiceItems: 用來設置對話框顯示一系列的單選按鈕
  8. //public Builder setSingleChoiceItems(CharSequence[] items, int ch
    eckedItem, final OnClickListener listener)
  9. //items同上
  10. //checkedItem代表初始化被選中的項
    12.
  11. setMultiChoiceItems: 用來設置對話框顯示一系列的複選框
  12. //public Builder setMultiChoiceItems(CharSequence[] items,
    boolean[] checkedItems,
  13. final OnMultiChoiceClickListener listener)
  14. //items同上
  15. //checkedItems是一個boolean數組,代表列表中所有項的初始勾選狀態
  16. //監聽方式我們下面介紹區域3那裏使我們的Action Buttons部分,這裏我們可以定義我們的操作按鈕。
    在AlertDialog中,定義按鈕都是通過 setXXXButton 方法來完成,其中一共有3種不同的
    Action Buttons供我們選擇:
    setPositiveButton(CharSequence text, DialogInterface.OnClickListener l
    istener)
    這是一個相當於OK、確定操作的按鈕,
    setNegativeButton (CharSequence text, DialogInterface.OnClickListener
    listener)
    這是一個相當於取消操作的按鈕。
    setNeutralButton (CharSequence text, DialogInterface.OnClickListener l
    istener)
    這個是相當於一個忽略操作的按鈕。

AlertDialog的監聽事件
在AlertDialog的各種設置中,都充斥着DialogInterface.OnClickListener,比如按鈕,內容
區的items,單選按鈕等,只有多選按鈕是用了另外一個監聽

DialogInterface.OnMultiChoiceClickListener。
public void onClick(DialogInterface dialog, int which);
//which代表items,單選按鈕中的序號

//多選按鈕的監聽

public void onClick(DialogInterface dialog, int which, boolean
isChecked);
//which代表items,單選按鈕中的序號
//isChecked代表當前點擊的序號是否被勾選

AlertDialog還支持ListAdapter的子類,我們可以傳入各種ListAdapter的子類,來顯示覆雜
的列表,當然直接使用 setView 也可以辦到

  1. public Builder setAdapter(final ListAdapter adapter, final
    OnClickListener listener)

進度對話框(ProgressDialog)ProgressDialog是AlertDialog類的子類,可以爲一個未定義進度的任務顯示一個旋轉輪形狀的進度動畫,或者爲一個指定進度的任務顯示一個進度條。它的用處非常廣泛,在每次用戶操
作一個延遲的任務時,我們都必須以進度對話框的形式告訴用戶,否者用戶並不知道操作已經
開始,可能會多次操作同一個任務,並有可能導致異常發生。
構造方法和常用方法

  • public ProgressDialog(Context context) //構造方法需要傳入一個上下

    public void setProgressStyle(int style) //給定一個樣式,帶進度條和
    不帶進度條的樣式
    //可選值
    //STYLE_SPINNER 默認 圓形,沒有進度條的樣式
    //STYLE_HORIZONTAL 給定進度條的樣式
    public void setMax(int max) //設置進度最大值,需要給定STYLE_HORIZONTAL
    public void setCancelable(boolean flag) //是否能用返回鍵關閉 true
    可以關閉,false不能關閉
    public void setMessage(CharSequence message) //設置一個消息
    public boolean isShowing() //判斷Dialog是否顯示
    public void dismiss() //關閉對話框
    //ProgressDialog從AlertDialog中繼承的常用方法setIcon和setTitile
    //雖然ProgressDialog可以設置Button,但是我們一般都不會去使用它

日期與時間選擇器對話框

DatePickerDialog與TimePickerDialog都繼承於AlertDialog,基本方法和我們前面講的
DatePicker和TimePicker組件一樣,只是需要調用Dialog的show方法來顯示。在構造方法裏
需要傳入回調監聽

  • public interface OnTimeChangedListener {
    void onTimeChanged(TimePicker view, int hourOfDay, int minute);
    //用戶改變時間後的監聽
    } public interface OnDateChangedListener {
    void onDateChanged(DatePicker view, int year, int monthOfYear,
    int dayOfMonth);
    //用戶改變日期後的監聽
    }

通知(Notification)

Notification是一種具有全局效果的通知,它展示在屏幕的頂端,首先會表現爲一個圖標的形
式,當用戶向下滑動的時候,展示出通知具體的內容。
它是一種讓你的應用程序在沒有開啓情況下或在後臺運行警示用戶。它是看不見的程序組件
(Broadcast Receiver,Service和不活躍的Activity)警示用戶有需要注意的事件發生的最好途
徑。

狀態欄和狀態條

狀態條就是手機屏幕最上方的一個條形狀的區域;
在狀態條有好多信息量:比如usb連接圖標,手機信號圖標,電池電量圖標,時間圖標等
等;
狀態欄就是手從狀態條滑下來的可以伸縮的view;
在狀態欄中一般有兩類(使用FLAG_標記):

*-(1)正在進行的程序
(2)通知事件

大概來描述創建一個Notification傳送的信息有

  • 一個狀態條圖標
  • 在拉伸的狀態欄窗口中顯示帶有大標題,小標題,圖標的信息,並且有處理該點擊事件:
    比如調用該程序的入口類
    閃光,LED,或者震動
    這裏寫圖片描述

  • 內容信息:1.內容標題 2.大圖標 3.內容 4.內容附加信息 5.小圖標 6.時間

下面對Notification類中的一些常量,字段,方法簡單介紹一下:

  • DEFAULT_ALL 使用所有默認值,比如聲音,震動,閃屏等
  • DEFAULT_LIGHTS 使用默認閃光提示
  • DEFAULT_SOUNDS 使用默認提示聲音
  • DEFAULT_VIBRATE 使用默認手機震動

以上的效果常量可以疊加,即通過mNotifaction.defaults =DEFAULT_SOUND |

  • DEFAULT_VIBRATE;
    (最好在真機上測試,震動效果模擬器上沒有)
    注意: 加入手機震動,一定要在manifest.xml中加入權限:
    uses-permission android:name=”android.permission.VIBRATE”

設置flag位

  • FLAG_AUTO_CANCEL 該通知能被狀態欄的清除按鈕給清除掉
  • FLAG_NO_CLEAR 該通知不能被狀態欄的清除按鈕給清除掉
  • FLAG_ONGOING_EVENT 通知放置在正在運行
  • FLAG_INSISTENT 是否一直進行,比如音樂一直播放,知道用戶響應

常用字段:

  • contentIntent 設置PendingIntent對象,點擊時發送該Inte
    nt,
  • defaults 添加默認效果
  • flags 設置flag位,例如FLAG_NO_CLEAR等
  • icon 設置圖標5. sound 設置聲音
  • tickerText 顯示在狀態欄中的文字
  • when 發送此通知的時間戳

創建Notification
一個notification不必對上面所有的選項都進行設置,但有3項是必須的:

  • 小圖標 setSmallIcon()
  • 內容標題 setContentTitle()
  • 內容 setContentText()

NotificationManager

通知一般通過NotificationManager服務來發送一個Notification對象來完成,NotificationManager是一個重要的系統級服務,該對象位於應用程序的框架層中,應用程序可以通過它像系統發送全局的通知。這個時候需要創建一個Notification對象,用於承載通知的內容。快速創建一個Notification的步驟簡單可以分爲以下四步:

  • 實例化一個Notification.Builder對象;
    注意:在 android:minSdkVersion <16以下時,可以使用
  • NotificationCompat.Builder創建。
  • 調用builder的相關方法對notification進行上面提到的各種字段
  • 調用builder.build()方法此方法返回一個notification對象。
    實例化一個NotificationManager對象;
  • 調用manager的notify方法。

注意: Notification也是使用Builder模式來創建的,它的靜態方法已經過期。
注意: 所有的系統服務都是使用Context.getService()方法獲取,如通知管理器,音量管
理器,傳感器管理器等等

更新與移除通知

在使用NotificationManager.notify()發送通知的時候,需要傳遞一個標識符,用於唯一標識這個通知。對於有些場景,並不是無限的添加新的通知,有時候需要更新原有通知的信息,這個時候可以重寫構建Notification,而使用與之前通知相同標識符來發送通知,這個時候舊的通知就被被新的通知所取代,起到更新通知的效果
對於一個通知,當展示在狀態欄之後,但是使用過後,如何取消呢?Android爲我們提供兩種方式移除通知,一種是Notification自己維護,使用setAutoCancel()方法設置是否維護,傳遞一個boolean類型的數據。另外一種方式使用NotificationManager通知管理器對象來維護,它通過notify()發送通知的時候,指定的通知標識Id來操作通知,可以使用cancel(int)來移除一個指定的通知,也可以使用cancelAll()移除所有的通知。
NotificationManager常用方法

  • public void cancelAll()
    //移除所有通知 (只是針對當前Context下的Notification)

  • public void cancel(int id)
    //移除標記爲id的通知 (只是針對當前Context下的所有Notification)

  • public void notify(String tag ,int id, Notification notification)
    //將通知加入狀態欄,標籤爲tag,標記爲id

  • public void notify(int id, Notification notification)
    //將通知加入狀態欄,,標記爲id

PendingIntent

對於一個通知而言,它顯示的消息是有限的,一般僅用於提示一些概要信息。但是一般簡短的消息,並
不能表達需要告訴用戶的全部內容,所以需要綁定一個意圖,當用戶點擊通知的時候,調用一個意圖展
示出一個Activity用來顯示詳細的內容。而Notification中,並不使用常規的Intent去傳遞一個
意圖,而是使用PendingIntent。根據字面意思就知道是延遲的intent,主要用來在某個事件完成後執行特定的Action。PendingIntent包含了Intent及Context,所以就算Intent所屬程序結束,PendingIntent依然
有效,可以在其他程序中使用。常用在通知欄及短信發送系統中。
PendingIntent一般作爲參數傳給某個實例,在該實例完成某個操作後自動執行
PendingIntent上的Action,也可以通過PendingIntent的send函數手動執行,並可以在
send函數中設置OnFinished表示send成功後執行的動作。
PendingIntent提供了多個靜態的getXxx()方法,用於獲得適用於不同場景的PendingIntent對象。一般需要傳遞的幾個參數都很常規,只介紹一個flag參數,用於標識PendingIntent的
構造選擇:

  • FLAG_CANCEL_CURRENT: 如果構建的PendingIntent已經存在,則取消前一個,重
    新構建一個。
  • FLAG_NO_CREATE: 如果前一個PendingIntent已經不存在了,將不再構建它
  • FLAG_ONE_SHOT: 表明這裏構建的PendingIntent只能使用一次。
  • FLAG_UPDATE_CURRENT: 如果構建的PendingIntent已經存在,則替換它,常用。

Intent和PendingIntent的區別

  • Intent是立即使用的,而PendingIntent可以等到事件發生後觸發,PendingIntent可以
    cancel
  • Intent在程序結束後即終止,而PendingIntent在程序結束後依然有效
  • PendingIntent自帶Context,而Intent需要在某個Context內運行
  • Intent在原task中運行,PendingIntent在新的task中運行

自定義佈局notification

和Toast一樣,通知也可以使用自定義的XML來自定義樣式,但是對於通知而言,因爲它的全
局性,並不能簡單的通過inflate膨脹出一個View,因爲可能觸發通知的時候,響應的App已
經關閉,無法獲取當指定的XML佈局文件。所以需要使用單獨的一個RemoteViews類來操作
RemoteViews類
RemoteViews 類描述了一個View對象能夠顯示在其他進程中,可以融合從一個layout資源文
件實現佈局。
如何實例化一個RemoteViews
//構造方法

  • RemoteViews(String packageName, int layoutId)
    //通過指定的佈局文件新建一個RemoteViews對象。
  • RemoteViews可以使用它的一系列setXxx()方法通過控件的Id設置控件的屬性。
    爲控件設置監聽1. public void setOnClickPendingIntent (int viewId, PendingIntent
    pendingIntent)
  • //相當於調用View.OnClickListener啓動準備好的PendingIntent。當在集合中設置
    條目的onClick動作時不起作用。
  • //viewId 當點擊時將要觸發PendingIntent的視圖的id
  • //pendingIntent 當點擊時傳過去的PendingIntent
    最後使用Notification.Builder.setContent(RemoteViews)方法設置它到一個Notification
    中。

例:

  • 發送一條帶有TextView的通知。
    1. //創建一個RemoteView視圖
    2. RemoteViews contentView = new RemoteViews(getPackageName(),android.R.la
      yout.simple_list_item_1);
    3. //設置佈局中的TextView爲紅色,並設置文字。
    4. contentView.setTextViewText(android.R.id.text1, “測試”);
    5. contentView.setTextColor(android.R.id.text1, Color.RED);
    6. Notification notify = new Notification.Builder(this)
    7. .setSmallIcon(R.drawable.ic_launcher).setContent(conten
      tView)
    8. .setTicker(“標題”).build();

Snackbar組件

Snackbar組件是 Android design support library 中的類,是爲了在低版本下使用Android5.0的一些新特新。

  • Eclipse中使用
    1. 要使用該lib包,將Android Manager中的Android support library升級到最新。
    2. 然後在在sdk->extras->android中查找design導入工程,並且將V7包導入工程,在使用依
      賴庫的方法添加進來,
  • 在Android Studio項目的build.gradle(Module:app)
    1. 添加:compile ‘com.android.support:design:*’
    2. *代表着你現在support library的版本Snackbar爲一個操作提供輕量級、快速的反饋。Snackbar顯示在屏幕的底部(有MD動畫效
      果浮現和消失),包含了文字信息與一個可選的操作按鈕。在指定時間結束之後自動消失。另
      外,用戶還可以在超時之前將它滑動刪除。Snackbar被看作是比Toast更強大的快速反饋機
      制,你會發現他們的API非常相似。你應該注意到了make()方法中把一個View作爲第一個參數
      (Snackbar試圖找到一個合適的父親以確保自己是被放置於底部)。
      官方推薦使用 CoordinatorLayout 這個另一個 Android Support Design Library 庫支持的
      控件容納。因爲使用這個控件,可以保證Snackbar可以讓用戶通過向右滑動退出。

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”
tools:context=”com.example.mudclient.MainActivity”

android.support.design.widget.CoordinatorLayout
android:id=”@+id/coordinator”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_alignParentBottom=”true”

//java代碼中

  • CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.
    coordinator);
    Snackbar.make(coordinator, “呵呵”, Snackbar.LENGTH_LONG).show();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章