Mango 2011-05-09
系出名门Android(3)-对话框(Dialog)和通知(Notification)
作者:webabcd
介绍
在Android中种对话框及各种通知效果的应用
常用对话框的使用,弹出式对话框、日期选择对话框、时间选择对话框、进度条对话框
通知(出现在通知列表)和提示性通知(Toast)的演示
1、常用对话框的演示
res/layout/main.xml
代码
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:id="@+id/txtMsg"android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn2"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn3"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn4"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn5"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn6"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
res/layout/view.xml
代码
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:text="我是一个View"
android:layout_width="wrap_content"android:layout_height="wrap_content">
</TextView>
</LinearLayout>
res/values/array.xml
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
<!--
定义一个名为ary的string类型的数组
-->
<string-arrayname="ary">
<item>项目1</item>
<item>项目2</item>
</string-array>
</resources>
Main.java
代码
packagecom.webabcd.dialog;
importjava.util.Calendar;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.DatePickerDialog;
importandroid.app.Dialog;
importandroid.app.ProgressDialog;
importandroid.app.TimePickerDialog;
importandroid.app.DatePickerDialog.OnDateSetListener;
importandroid.app.TimePickerDialog.OnTimeSetListener;
importandroid.content.DialogInterface;
importandroid.content.DialogInterface.OnClickListener;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.DatePicker;
importandroid.widget.TextView;
importandroid.widget.TimePicker;
importandroid.widget.Button;
publicclassMainextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//弹出式对话框的Demo。先调用Builder(),在Create(),需要显示对话框的是后再调用show()
AlertDialogdialog=newAlertDialog.Builder(this).setTitle("弹出对话框").create();
dialog.show();
//以下是各种对话框的Demo
MyButtonClickListenerlistener=newMyButtonClickListener();
Buttonbtn1=(Button)this.findViewById(R.id.btn1);
btn1.setText("简单的对话框的Demo");
btn1.setOnClickListener(listener);
Buttonbtn2=(Button)this.findViewById(R.id.btn2);
btn2.setText("包括常用设置的对话框(数据来自xml)");
btn2.setOnClickListener(listener);
Buttonbtn3=(Button)this.findViewById(R.id.btn3);
btn3.setText("弹出的对话框的内容是一个View");
btn3.setOnClickListener(listener);
Buttonbtn4=(Button)this.findViewById(R.id.btn4);
btn4.setText("日期选择对话框");
btn4.setOnClickListener(listener);
Buttonbtn5=(Button)this.findViewById(R.id.btn5);
btn5.setText("时间选择对话框");
btn5.setOnClickListener(listener);
Buttonbtn6=(Button)this.findViewById(R.id.btn6);
btn6.setText("进度条对话框");
btn6.setOnClickListener(listener);
}
classMyButtonClickListenerimplementsView.OnClickListener{
@Override
publicvoidonClick(Viewv){
//具体的对话框的实现可以通过重写onCreateDialog完成
switch(v.getId()){
caseR.id.btn1:
Main.this.showDialog(0);
break;
caseR.id.btn2:
Main.this.showDialog(1);
break;
caseR.id.btn3:
Main.this.showDialog(2);
break;
caseR.id.btn4:
Main.this.showDialog(3);
break;
caseR.id.btn5:
Main.this.showDialog(4);
break;
caseR.id.btn6:
Main.this.showDialog(5);
break;
}
}
}
@Override
publicDialogonCreateDialog(intid){
switch(id){
case0:
//一个简单的弹出对话框
returnnewAlertDialog.Builder(this).setTitle("这是一个简单的弹出对话框的Demo")
.create();
case1:
//一个相对复杂的弹出对话框
returnnewAlertDialog.Builder(this)
.setTitle("标题")//设置标题
//.setCustomTitle(View)//以一个View作为标题
.setIcon(R.drawable.icon01)//设置标题图片
//.setMessage("信息")//需要显示的弹出内容
.setPositiveButton("确定",newOnClickListener(){//设置弹框的确认按钮所显示的文本,以及单击按钮后的响应行为
@Override
publicvoidonClick(DialogInterfacea0,inta1){
TextViewtxtMsg=(TextView)Main.this.findViewById(R.id.txtMsg);
txtMsg.append("单击了对话框上的“确认”按钮\n");
}
})
.setItems(R.array.ary,newDialogInterface.OnClickListener(){//弹框所显示的内容来自一个数组。数组中的数据会一行一行地依次排列
publicvoidonClick(DialogInterfacedialog,intwhich){
}
})
//其他常用方法如下
//.setMultiChoiceItems(arg0,arg1,arg2)
//.setSingleChoiceItems(arg0,arg1,arg2)
//.setNeutralButton(arg0,arg1)
//.setNegativeButton(arg0,arg1)
.create();
case2:
//弹出对话框为指定的View的Demo
returnnewAlertDialog.Builder(this).setTitle("此对话框的内容是一个View")
.setView(this.findViewById(R.layout.view)).create();
case3:
//弹出日期选择对话框
Calendarc=Calendar.getInstance();
returnnewDatePickerDialog(this,newOnDateSetListener(){
@Override
publicvoidonDateSet(DatePickerview,intyear,intmonthOfYear,intdayOfMonth){
TextViewtxtMsg=(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));
case4:
//弹出时间选择对话框
Calendarc2=Calendar.getInstance();
returnnewTimePickerDialog(this,newOnTimeSetListener(){
@Override
publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){
TextViewtxtMsg=(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);
case5:
//弹出进度条对话框
ProgressDialogprogress=newProgressDialog(this);
progress.setMessage("loading...");
returnprogress;
default:
returnnull;
}
}
}
2、各种提示效果的演示
res/layout/main.xml
代码
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn2"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn3"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Buttonandroid:id="@+id/btn4"android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
res/layout/view.xml
代码
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:id="@+id/txtMsg"android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
Main.java
代码
packagecom.webabcd.notification;
importandroid.app.Activity;
importandroid.app.Notification;
importandroid.app.NotificationManager;
importandroid.app.PendingIntent;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassMainextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//通过Tost.makeText().show()来实现提示性的通知效果
//短时间的提示性通知的Demo
Buttonbtn1=(Button)this.findViewById(R.id.btn1);
btn1.setText("短时间提示");
btn1.setOnClickListener(newButton.OnClickListener(){
publicvoidonClick(Viewv){
Toast.makeText(Main.this,"我是短时间提示",Toast.LENGTH_SHORT).show();
}
});
//长时间的提示性通知的Demo
Buttonbtn2=(Button)this.findViewById(R.id.btn2);
btn2.setText("长时间提示");
btn2.setOnClickListener(newButton.OnClickListener(){
publicvoidonClick(Viewv){
Toast.makeText(Main.this,"我是长时间提示",Toast.LENGTH_LONG).show();
}
});
//以一个View作为提示性通知的Demo
Buttonbtn3=(Button)this.findViewById(R.id.btn3);
btn3.setText("以一个View做提示");
btn3.setOnClickListener(newButton.OnClickListener(){
publicvoidonClick(Viewv){
Viewview=inflateView(R.layout.view);
TextViewtxtMsg=(TextView)view.findViewById(R.id.txtMsg);
txtMsg.setText("提示内容");
Toasttoast=newToast(Main.this);
toast.setView(view);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
}
});
Buttonbtn4=(Button)this.findViewById(R.id.btn4);
btn4.setText("发出一个通知(Notification)");
btn4.setOnClickListener(newButton.OnClickListener(){
publicvoidonClick(Viewv){
//实例化通知管理器
NotificationManagernm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
//指定单击通知后所打开的详细的通知页面(单击通知后打开NotificationView)
PendingIntentcontentIntent=PendingIntent.getActivity(
Main.this,0,newIntent(Main.this,NotificationView.class),0);
//实例化一个通知,并指定其图标和标题(在提示栏上显示)
Notificationn=newNotification(R.drawable.icon01,"我是滚动的通知信息我是滚动的通知信息我是滚动的通知信息",System.currentTimeMillis());
//设置通知的发送人和通知的详细内容(打开提示栏后在通知列表中显示)
n.setLatestEventInfo(Main.this,"通知发送人","我是详细的通知信息我是详细的通知信息我是详细的通知信息",contentIntent);
//100毫秒延迟后,震动250毫秒,暂停100毫秒后,再震动500毫秒
n.vibrate=newlong[]{100,250,100,500};
//发出通知(其中第一个参数为通知标识符)
nm.notify(0,n);
}
});
}
//将指定的xml资源转换为一个View
privateViewinflateView(intresource){
LayoutInflatervi=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
returnvi.inflate(resource,null);
}
//打开详细通知页后此Activity会被Pause,从详细通知页返回后此Activity会被Resume
@Override
protectedvoidonPause(){
//TODOAuto-generatedmethodstub
super.onPause();
Log.d("MyDebug","onPause");
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
super.onResume();
Log.d("MyDebug","onResume");
}
}
NotificationView.java
代码
packagecom.webabcd.notification;
importandroid.app.Activity;
importandroid.app.NotificationManager;
importandroid.os.Bundle;
importandroid.widget.TextView;
//单击通知列表的某个通知后,所打开的详细的通知页
publicclassNotificationViewextendsActivity{
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
TextViewtxtMsg=(TextView)this.findViewById(R.id.txtMsg);
txtMsg.setText("点通知之后所链接到的Activity");
NotificationManagernm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
//取消显示在通知列表中的指定通知(参数为通知标识符)
nm.cancel(0);
//需要关闭此Activity的话就finish它既可
//this.finish();
}
}