介紹
在 Android 中種對話框及各種通知效果的應用
- 常用對話框的使用,彈出式對話框、日期選擇對話框、時間選擇對話框、進度條對話框
- 通知(出現在通知列表)和提示性通知(Toast)的演示
1、常用對話框的演示
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;
}
}
}
2、各種提示效果的演示
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
[源碼下載]