系出名門Android(3) - 對話框(Dialog)和通知(Notification) java
做者:webabcd android
介紹 web
在 Android 中種對話框及各類通知效果的應用 經常使用對話框的使用,彈出式對話框、日期選擇對話框、時間選擇對話框、進度條對 話框 通知(出如今通知列表)和提示性通知(Toast)的演示 一、經常使用對話框的演示 res/layout/main.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/txtMsg" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn5" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> res/layout/view.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="我是⼀個 View" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> </LinearLayout> res/values/array.xml <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 定義⼀個名爲 ary 的 string 類型的數組 --> <string-array name="ary"> <item>項目 1</item> <item>項目 2</item> </string-array> </resources> Main.java 代碼 package com.webabcd.dialog; import java.util.Calendar; import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.app.TimePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.TimePickerDialog.OnTimeSetListener; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Button; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 彈出式對話框的 Demo。先調用 Builder(),在 Create(), 須要顯示對話框的是後再 調用 show() AlertDialog dialog = new AlertDialog.Builder(this).setTitle("彈出對話框").create(); dialog.show(); // 如下是各類對話框的 Demo MyButtonClickListener listener = new MyButtonClickListener(); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setText("簡單的對話框的 Demo"); btn1.setOnClickListener(listener); Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setText("包括經常使用設置的對話框(數據來自 xml)"); btn2.setOnClickListener(listener); Button btn3 = (Button) this.findViewById(R.id.btn3); btn3.setText("彈出的對話框的內容是⼀個 View"); btn3.setOnClickListener(listener); Button btn4 = (Button) this.findViewById(R.id.btn4); btn4.setText("日期選擇對話框"); btn4.setOnClickListener(listener); Button btn5 = (Button) this.findViewById(R.id.btn5); btn5.setText("時間選擇對話框"); btn5.setOnClickListener(listener); Button btn6 = (Button) this.findViewById(R.id.btn6); btn6.setText("進度條對話框"); btn6.setOnClickListener(listener); } class MyButtonClickListener implements View.OnClickListener { @Override public void onClick(View v) { // 具體的對話框的實現能夠經過重寫 onCreateDialog 完成 switch (v.getId()) { case R.id.btn1: Main.this.showDialog(0); break; case R.id.btn2: Main.this.showDialog(1); break; case R.id.btn3: Main.this.showDialog(2); break; case R.id.btn4: Main.this.showDialog(3); break; case R.id.btn5: Main.this.showDialog(4); break; case R.id.btn6: Main.this.showDialog(5); break; } } } @Override public Dialog onCreateDialog(int id) { switch (id) { case 0: // ⼀個簡單的彈出對話框 return new AlertDialog.Builder(this).setTitle("這是⼀個簡單的彈出對話框的 Demo") .create(); case 1: // ⼀個相對複雜的彈出對話框 return new AlertDialog.Builder(this) .setTitle("標題") // 設置標題 // .setCustomTitle(View) // 以⼀個 View 做爲標題 .setIcon(R.drawable.icon01) // 設置標題圖片 // .setMessage("信息") // 須要顯示的彈出內容 .setPositiveButton("肯定", new OnClickListener() { // 設置彈框的確認按鈕所顯示的文本 ,以及單擊按鈕後的響應行爲 @Override public void onClick(DialogInterface a0, int a1) { TextView txtMsg = (TextView) Main.this.findViewById(R.id.txtMsg); txtMsg.append("單擊了對話框上的「確認」按鈕\n"); } }) .setItems(R.array.ary, new DialogInterface.OnClickListener() { // 彈框所顯示的內容來自 ⼀個數組。數組中的數據會⼀行⼀行地依次排列 public void onClick(DialogInterface dialog, int which) { } }) // 其餘經常使用方法以下 // .setMultiChoiceItems(arg0, arg1, arg2) // .setSingleChoiceItems(arg0, arg1, arg2) // .setNeutralButton(arg0, arg1) // .setNegativeButton(arg0, arg1) .create(); case 2: // 彈出對話框爲指定的 View 的 Demo return new AlertDialog.Builder(this).setTitle("此對話框的內容是⼀個 View") .setView(this.findViewById(R.layout.view)).create(); case 3: // 彈出日期選擇對話框 Calendar c = Calendar.getInstance(); return new DatePickerDialog(this, new OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { TextView txtMsg = (TextView) Main.this.findViewById(R.id.txtMsg); txtMsg.append("新設置的日期爲:" + String.valueOf(year) + "-" + String.valueOf(monthOfYear) + "-" + String.valueOf(dayOfMonth) + "\n"); } }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE)); case 4: // 彈出時間選擇對話框 Calendar c2 = Calendar.getInstance(); return new TimePickerDialog(this, new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { TextView txtMsg = (TextView) Main.this.findViewById(R.id.txtMsg); txtMsg.append("新設置的時間爲:" + String.valueOf(hourOfDay) + ":" + String.valueOf(minute) + "\n"); } }, c2.get(Calendar.HOUR), c2.get(Calendar.MINUTE), true); case 5: // 彈出進度條對話框 ProgressDialog progress = new ProgressDialog(this); progress.setMessage("loading..."); return progress; default: return null; } } } 二、各類提示效果的演示 res/layout/main.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> res/layout/view.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/txtMsg" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> </LinearLayout> Main.java 代碼 package com.webabcd.notification; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 經過 Tost.makeText().show() 來實現提示性的通知效果 // 短期的提示性通知的 Demo Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setText("短期提示"); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Toast.makeText(Main.this, "我是短期提示", Toast.LENGTH_SHORT).show(); } }); // 長時間的提示性通知的 Demo Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setText("長時間提示"); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Toast.makeText(Main.this, "我是長時間提示", Toast.LENGTH_LONG).show(); } }); // 以⼀個 View 做爲提示性通知的 Demo Button btn3 = (Button) this.findViewById(R.id.btn3); btn3.setText("以⼀個 View 作提示"); btn3.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { View view = inflateView(R.layout.view); TextView txtMsg = (TextView) view.findViewById(R.id.txtMsg); txtMsg.setText("提示內容"); Toast toast = new Toast(Main.this); toast.setView(view); toast.setDuration(Toast.LENGTH_LONG); toast.show(); } }); Button btn4 = (Button) this.findViewById(R.id.btn4); btn4.setText("發出⼀個通知(Notification)"); btn4.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // 實例化通知管理器 NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 指定單擊通知後所打開的詳細的通知頁面(單擊通知後打開 NotificationView) PendingIntent contentIntent = PendingIntent.getActivity( Main.this, 0, new Intent(Main.this, NotificationView.class), 0); // 實例化⼀個通知,並指定其圖標和標題(在提示欄上顯示) Notification n = new Notification(R.drawable.icon01, "我是滾動的通知信息我是滾動的通 知信息我是滾動的通知信息", System.currentTimeMillis()); // 設置通知的發送人和通知的詳細內容(打開提示欄後在通知列表中顯示) n.setLatestEventInfo(Main.this, "通知發送人", "我是詳細的通知信息我是詳細的通知信息 我是詳細的通知信息", contentIntent); // 100 毫秒延遲後,震動 250 毫秒,暫停 100 毫秒後,再震動 500 毫秒 n.vibrate = new long[] { 100, 250, 100, 500 }; // 發出通知(其中第⼀個參數爲通知標識符) nm.notify(0, n); } }); } // 將指定的 xml 資源轉換爲⼀個 View private View inflateView(int resource) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); return vi.inflate(resource, null); } // 打開詳細通知頁後此 Activity 會被 Pause,從詳細通知頁返回後此 Activity 會被 Resume @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.d("MyDebug", "onPause"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d("MyDebug", "onResume"); } } NotificationView.java 代碼 package com.webabcd.notification; import android.app.Activity; import android.app.NotificationManager; import android.os.Bundle; import android.widget.TextView; // 單擊通知列表的某個通知後,所打開的詳細的通知頁 public class NotificationView extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view); TextView txtMsg = (TextView)this.findViewById(R.id.txtMsg); txtMsg.setText("點通知以後所連接到的 Activity"); NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 取消顯示在通知列表中的指定通知(參數爲通知標識符) nm.cancel(0); // 須要關閉此 Activity 的話就 finish 它既可 // this.finish(); } } OK [源碼下載]