常見的向用戶發送提示信息的方式有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);
以上,就是三種向用戶發送提示信息的三種方式。