android菜鳥學習筆記29----Android應用向用戶發送提示信息的方式總結

常見的向用戶發送提示信息的方式有3種,分別爲:java

1)發送Toast信息android

2)彈出對話框數組

3)發送通知ide

總結以下:函數

方式1:發送Toast信息:佈局

這種方式最簡單,在以前的學習中屢次使用過。Toast是在一個浮動於應用之上的View中顯示信息,顯示必定的時間間隔後自動消失,不可得到焦點。學習

最簡單的用法就是以前的學習中一直使用的:經過一個靜態的makeText()方法返回一個Toast對象,而後調用show()方法。測試

如:ui

佈局文件添加一個Button:this

 1 <Button
 2 
 3         android:id="@+id/button1"
 4 
 5         android:onClick="showToast"
 6 
 7         android:layout_width="wrap_content"
 8 
 9         android:layout_height="wrap_content"
10 
11         android:layout_gravity="center_horizontal"
12 
13         android:layout_margin="20dp"
14 
15         android:text="@string/show_toast" />

MainActivity.java添加一個showToast()方法:

1 public void showToast(View view){
2 
3           Toast.makeText(this, "客觀,您要的吐司來啦", Toast.LENGTH_LONG).show();
4 
5 }

顯示結果:

 

一般狀況下,Toast.makeText()這個方法已然夠用了,可是,若是有些別的需求,就須要看一下Toast的幫助信息了:

 

在Toast這個類中定義了兩個常量:LENGTH_LONG和LENGTH_SHORT,用來表示Toast顯示的時長。想讓Toast停留的時間長一點,能夠設置爲LENGTH_LONG,不然設置爲LENGTH_SHORT。

LENGTH_LONG的實際值爲1,LENGTH_SHORT的實際值爲0。在用到的地方也能夠直接傳入0或者1,可是閱讀起來就顯得不太直觀了。

 

Toast中只定義了一個構造函數,傳入一個上下文對象,返回一個空的Toast對象。

更經常使用的是,經過下面兩個靜態方法獲取Toast對象:

 

這兩個方法的區別在於第二個參數,該參數表示要顯示的文本內容,第一個方法傳入strings.xml中的一個字符串id,而第二個方法直接傳入字符串對象,以前用到的都是第二個方法。下面測試下傳入id的方法:

strings.xml中加入一個<string>節點:

<string name="tv_text">客官,這個是放在strings.xml的Toast,請慢用</string>

修改showToast()方法:

1 public void showToast(View view){
2 
3           Toast.makeText(this, R.string.tv_text, Toast.LENGTH_LONG).show();
4 
5 }

運行結果:

 

若是直接使用Toast的構造方法獲取一個Toast對象的話,該對象是一個空的Toast,這時,是不能直接show()的,畢竟沒有任何要顯示的內容。

若是:new Toast(this).show();

會報錯:

 

提示,必須先調用setView():

 

固然,確定有對應的getView():

 

這兩個方法,分別用來給Toast設置要顯示的View和取得當前Toast對象的View。

測試下setView()方法:

新建一個tv.xml佈局文件:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2 
 3     android:layout_width="match_parent"
 4 
 5     android:layout_height="match_parent"
 6 
 7     android:gravity="center_horizontal"
 8 
 9     android:orientation="vertical" >
10 
11     <TextView
12 
13         android:id="@+id/tv"
14 
15         android:layout_width="wrap_content"
16 
17         android:layout_height="wrap_content"
18 
19         android:text="@string/tv_text" />
20 
21  
22 
23     <Button
24 
25         android:id="@+id/btn1"
26 
27         android:layout_width="wrap_content"
28 
29         android:layout_height="wrap_content"
30 
31         android:text="Button" />
32 
33 </LinearLayout>

修改showToast()方法:

 1 public void showToast(View view){
 2 
 3           Toast toast = new Toast(this);
 4 
 5           View v = getLayoutInflater().from(this).inflate(R.layout.tv, null);
 6 
 7           toast.setView(v);
 8 
 9           toast.show();
10 
11 }

 

顯示效果:

 

直接把tv.xml中的內容都顯示出來了,真醜……雖然顯示有按鈕,即使設置了事件監聽,可是因爲Toast是不能獲取焦點的,因此點擊是沒有任何反應的。

在使用makeText()方法時,傳入了三個參數,而構造方法只傳入了與之對應的第一個表示上下文的參數,於是確定有對應的setter方法:

 

setText()用於設置Toast中顯示的信息,可是,注意到幫助文檔中的信息:是用於修改以前使用makeText()建立的Toast對象顯示的信息,如Toast對象是經過構造方法建立的是不能調用setText()方法的。

 

setDuration()用於設置顯示的時長。

感受仍是挺雞肋的,加起來都不如一個makeText()。

下面這個方法,可能看起來稍微有用些:

 

用來設置Toast的顯示位置,如:

修改tv.xml設置個綠色背景,不要按鈕了,太醜也沒用:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2 
 3     android:layout_width="wrap_content"
 4 
 5     android:layout_height="wrap_content"
 6 
 7     android:background="#00ff00"
 8 
 9     android:orientation="vertical" >
10 
11     <TextView
12 
13         android:id="@+id/tv"
14 
15         android:layout_width="wrap_content"
16 
17         android:layout_height="wrap_content"
18 
19         android:text="客官,您要的Toast來啦,請慢用" />
20 
21 </LinearLayout>

 

修改showToast()方法:

 1 public void showToast(View view){
 2 
 3           Toast toast = new Toast(this);
 4 
 5           toast.setView(getLayoutInflater().inflate(R.layout.tv, null));
 6 
 7           toast.setDuration(1);
 8 
 9           toast.setGravity(Gravity.CENTER, 0, 0);
10 
11           toast.show();
12 
13 }

Gravity.CENTER表示的水平垂直均居中顯示,後面的參數分別表示在第一個參數的基礎上x軸方向上的偏移及y軸方向上的偏移,正數表示x軸上向右移動,y軸上向下移動;負數則表示x軸上向左移動,y軸上向上移動。這裏指定爲0,表示不偏移。

顯示效果:

 

確實,居中顯示了,並且是綠色背景,仍是好醜,實際中應該不會這樣用吧,費力不討好。

總結:上面一大堆無用的東西,實際使用中直接使用makeText()方法獲取Toast對象,須要修改顯示位置,則調用setGravity()方法便可。實在須要自定義佈局時再使用構造及setView()方法。

方式2:彈出對話框:

經過彈出對話框的形式向用戶發送提示信息的方式,就須要用到AlertDialog這個類,準確來講,用的更多的是它的內部類AlertDialog.Builder類。

其實,彈出對話框的流程很簡單:

1)獲取一個AlertDialog.Builder對象:

AlertDialog.Builder builder = new Builder(this);

 

2)調用Builder的各類setXX方法,設置對話框的樣式:

如:

builder.setTitle("俺是對話框");

builder.setMessage("沒什麼要說的");

3)顯示對話框:

builder.show();

 

1.彈出一個簡單對話框的示例:

修改佈局文件,添加一個按鈕,用於彈出對話框:

 1 <Button
 2 
 3         android:id="@+id/button2"
 4 
 5         android:onClick="showDialog"
 6 
 7         android:layout_width="wrap_content"
 8 
 9         android:layout_height="wrap_content"
10 
11         android:layout_gravity="center_horizontal"
12 
13         android:layout_margin="20dp"
14 
15         android:text="彈出對話框" />

在MainActivity中添加一個button2回調的方法:

 1 public void showDialog(View view){
 2 
 3           AlertDialog.Builder builder = new Builder(this);
 4 
 5           builder.setTitle("俺是對話框");
 6 
 7           builder.setMessage("沒什麼要說的");
 8 
 9           builder.setPositiveButton("肯定", new OnClickListener() {
10 
11                 
12 
13                  @Override
14 
15                  public void onClick(DialogInterface dialog, int which) {
16 
17                       Toast.makeText(MainActivity.this, "你點了肯定,啥也沒有", 1).show();
18 
19                  }
20 
21            });
22 
23           builder.setNegativeButton("取消", new OnClickListener() {
24 
25                 
26 
27                  @Override
28 
29                  public void onClick(DialogInterface dialog, int which) {
30 
31                       Toast.makeText(MainActivity.this, "取消啦", 1).show();
32 
33                  }
34 
35            });
36 
37           builder.show();
38 
39 }

運行結果:

 

可是,此時若是按下Back鍵,該對話框就自動關閉了,通常咱們須要的是用戶或者按下肯定或者按下取消,這時就能夠設置按下Back不進行任何操做:

builder.setCancelable(false);

 

2.彈出一個單選框,修改showDialog()方法:

 1 builder.setTitle("明天作什麼");
 2 
 3 final String[] items = new String[]{"看書","看電影","散步"};
 4 
 5 builder.setSingleChoiceItems(items, -1, new OnClickListener() {
 6 
 7             
 8 
 9              @Override
10 
11              public void onClick(DialogInterface dialog, int which) {
12 
13                    // TODO Auto-generated method stub
14 
15                    Toast.makeText(MainActivity.this, "你選了"+items[which], 1).show();
16 
17                    dialog.dismiss();
18 
19              }
20 
21 });

第一個參數是一個數組類型的單選項

第二個參數表示默認選定項目的下標,-1表示默認一個都不選

第三個參數指定選定項目的事件監聽器。

dialog.dismiss();表示關閉對話框

顯示效果:

 

3.彈出一個複選框,修改showDialog()方法:

 1 builder.setTitle("哪一個電影好看點");
 2 
 3       final String[] items = new String[]{"道士下山","大聖歸來","戰狼2","捉妖記","梔子花開"};
 4 
 5       builder.setMultiChoiceItems(items, new boolean[]{false,false,false,false,false}, new OnMultiChoiceClickListener() {
 6 
 7             
 8 
 9              @Override
10 
11              public void onClick(DialogInterface dialog, int which, boolean isChecked) {
12 
13                    // TODO Auto-generated method stub
14 
15                    Toast.makeText(MainActivity.this, "你以爲"+items[which]+(isChecked?"好看":"很差看"), 0).show();
16 
17              }
18 
19 });

 

運行結果:

 

4.顯示一個進度對話框:

1 ProgressDialog pd = new ProgressDialog(this);
2 
3 pd.setTitle("正在緩衝……");
4 
5 pd.setMessage("這網好爛啊……");
6 
7 pd.show();

運行結果:

 

調用: pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 能夠將進度對話框改成水平進度條的樣式:

 1 final ProgressDialog pd = new ProgressDialog(this);
 2 
 3       pd.setTitle("正在緩衝……");
 4 
 5       pd.setMessage("這網好爛啊……");
 6 
 7       pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 8 
 9       pd.setMax(100);
10 
11       pd.show();
12 
13       new Thread(){
14 
15             public void run(){
16 
17                  try {
18 
19                         for (int i = 0; i < 100; i++) {
20 
21                               Thread.sleep(1000);
22 
23                               pd.setProgress(i);
24 
25                         }
26 
27                         pd.dismiss();
28 
29                    } catch (Exception e) {
30 
31                         e.printStackTrace();
32 
33                    }
34 
35             }
36 
37       }.start();

運行結果:

 

注意:此時點擊屏幕對話框以外的部分,發現對話框消失了,解決方法:調用pd.setCancelable(false)。

方式3:發送通知:

當應用程序不在前臺時,或者只有後臺服務在運行,也許經過通知的方式向用戶發送提示信息更方便一些:

要使用通知,涉及到的類有:NotificationManager和Notification這兩個類。

見名知意,前一個用於管理通知,後一個就是被管理的通知實體類。

首先看管理器類:

NotificationManager要管理通知,因此有幾個比較經常使用的方法:

首先要獲取NotificationManager對象:

可是,查看幫助手冊卻沒有發現它的構造方法……

文檔中這樣描述的:

 

因此,應當經過getSystemService(String)方法獲取NotificationManager對象。

這個方法時Context中的方法,查看幫助手冊發現:

 

Context中定義了好幾個String類型的常量,其中就有NOTIFICATION_SERVICE,後面的描述信息更是直接說明經過將這個字符串常量傳給getSystemService()能夠獲取NotificationManager實例。

 

可是getSystemService()方法返回的是Object對象,故而,須要強制類型轉換:

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

 

notify()方法用於發出一個通知,cancel()方法因爲取消通知。

有了通知管理器,要讓它發送通知,仍是須要有通知實體的:

 

構造方法參數說明:

第一個參數用來指定通知在狀態欄的圖標

第二個參數用來指定通知在狀態欄的描述

第三個參數用來指定何時顯示

如:

Notification notification = new Notification(R.drawable.ic_launcher, "這是一個通知", System.currentTimeMillis());

 

 

Notification中的方法就這幾個,最有用的只有setLatestEventInfo()方法

 

用於給通知在任務欄中的顯示設置一個標準的佈局

參數說明:

第一個參數指定上下文

第二個參數指定在任務欄中顯示的標題

第三個參數指定在任務欄中顯示的內容

第四個參數是PendingIntent類型的,是一種特殊的意圖,用於指定通知被點擊以後的動做,若設置爲空則表示不進行任何處理。

一個簡單的通知示例:

在佈局文件中添加第三個按鈕,用於發送通知:

 1 <Button
 2 
 3         android:id="@+id/button3"
 4 
 5         android:onClick="showNotification"
 6 
 7         android:layout_width="wrap_content"
 8 
 9         android:layout_height="wrap_content"
10 
11         android:layout_gravity="center_horizontal"
12 
13         android:layout_margin="20dp"
14 
15         android:text="彈出通知" />

在MainActivity中添加一個showNotification()方法,用於按鈕的回調:

 1 public void showNotification(View view){
 2 
 3           NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 4 
 5           Notification notification = new Notification(R.drawable.ic_launcher, "這是一個通知", System.currentTimeMillis());
 6 
 7           notification.setLatestEventInfo(this, "這是個通知", "沒有通知內容", null);
 8 
 9           manager.notify(123, notification);
10 
11 }

運行效果:

 

查看任務欄:

 

可是,點擊這個通知是沒有任何反應的。

由於notification.setLatestEventInfo(this, "這是個通知", "沒有通知內容", null);第四個參數設置爲null了。

下面稍微瞭解下關於第四個參數的內容:

PendingIntent:延遲意圖,是一種特殊的意圖,這種意圖並非在發出以後當即獲得執行,而是交由其餘應用在恰當的時候進行執行處理。

PendingIntent實例的得到能夠經過如下幾個靜態方法:

getActivity(Context, int, Intent, int)返回一個PendingIntent實例用於啓動一個新的Activity。

getBroadcast(Context, int, Intent, int) 返回一個PendingIntent實例用於發出廣播

getService(Context, int, Intent, int) 返回一個PendingIntent實例用於啓動一個新的Service。

它們均須要傳入一個上下文對象,及一個普通的Intent對象。

下面獲取一個PendingIntent對象,用來打開一個新的Activity,而後將其傳入notification.setLatestEventInfo()方法:

新建一個Actvity:

 1 public class NotificationActivity extends Activity {
 2 
 3  
 4 
 5       @Override
 6 
 7       protected void onCreate(Bundle savedInstanceState) {
 8 
 9            super.onCreate(savedInstanceState);
10 
11            setContentView(R.layout.tv);
12 
13       }
14 
15 }

佈局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:background="#00ff00"

    android:orientation="vertical" >

    <TextView

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="客官,您要的通知來啦,請細閱" />

</LinearLayout>

修改showNotification()方法:

public void showNotification(View view){

          NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

          Notification notification = new Notification(R.drawable.ic_launcher, "這是一個通知", System.currentTimeMillis());

          Intent intent = new Intent(this, NotificationActivity.class);

          PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

          notification.setLatestEventInfo(this, "這是個通知", "沒有通知內容", pi);

          manager.notify(123, notification);

}

運行結果:

點擊通知:

 

Notification中更多的是設置通知的各個屬性,來更改通知的類型:

 

這些字段都是共有的,能夠直接賦值:

如:notificaion.icon設置通知的圖標

notification.sound設置通知的鈴音

notification.vibrate設置通知的震動模式,須要賦值爲一個long的數組

如notification.vibrate = new long[]{0,1000,500,1000,500};下標爲偶數的表示靜止時間,下標爲奇數的表示震動時間,單位爲毫秒

ledARGB、ledOffMS、ledOnMS能夠用來通知到來時led燈的顯示方式

這些均可以本身測試使用下,這裏不一一列舉了。

此外,新版本中能夠採用與對話框相似的Builder內部類方式,建立Notification對象那個,並設置其屬性,但出於兼容性的考慮,這裏沒有列舉:

簡單示例以下:

Notification notification = new Notification.Builder(this)

          .setSmallIcon(R.drawable.ic_launcher).setContentTitle("這是個通知")

          .setContentText("沒有通知內容").getNotification();

          manager.notify(123, notification);

以上,就是三種向用戶發送提示信息的三種方式。

相關文章
相關標籤/搜索