對話方塊之AlertDialog、DatePickerDialog(日期選擇對話方塊)、TimePickerDialog(時間選擇)、ProgressDialog(進度)、PopupWindow
AlertDialog及子類的繼承關係:
AlertDialog:(對話方塊是基於Activity的)
1.概述:
1)對話方塊分為兩種,一種是簡單的對話方塊,一種懸浮窗。
4.0之後,確定按鈕在右邊,而在2.3之前,是在左邊,要注意。
2)AlertDialog生成的對話方塊可分為4個區域:
圖示區
標題區
內容區
按鈕區
2.使用方法:
步驟:
1)建立builder,並set其圖片、標題、內容、以及各種按鈕
(注:1>按鈕的傳入引數除了其名稱,還有一個點選事件,而dialog中按鈕的點選事件是利用new DialogInterface.OnClickListener()來完成的。2>由於對話方塊式基於activity的,所以傳入的context應是當前介面.this)
由於set方法後得到的仍是builder,所以可以連續set。
2)builder的create()成為對話方塊。
3)對話方塊dialog顯示。
builder的介面:
指定對話方塊內容的幾種方法:
setMessage(); //設定簡單內容
setItems(); //設定對話方塊內容為簡單列表項。
setSingleChoiceItems(); //設定內容為單選列表項
setMultiChoiceItems(); //設定內容為多選列表項
setAdapter(); //設定內容為自定義列表項
setView(); //設定內容自定義View.- 對話方塊風格第視窗
只要在AndroidManifest.xml中的activity中加上一句:
android:theme=”@android:style/Theme.Dialog” - 對對話方塊進行屬性的設定
setCancelable():對話方塊可否取消,引數為true時:滑鼠點選別處,對話方塊會自動消失;引數為false時:對話方塊不能消失 ,預設為true
範例1:點擊出現簡單對話方塊
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//1.建立builder
builder.setIcon(R.drawable.liyifeng).setTitle("這是一個對話方塊").setMessage("這是其中的內容").setNegativeButton ("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(getApplicationContext(), "取消", Toast.LENGTH_LONG).show();
}
}).setNeutralButton("中性按鈕", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(getApplicationContext(), "中性按鈕", Toast.LENGTH_LONG).show();
}
}).setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(getApplicationContext(), "確定", Toast.LENGTH_SHORT).show();
}
});
Dialog dialog = builder.create();
dialog.show();
結果演示:
延伸:也可以在create()之後,由dialog來set,區別在於set按鈕時,此方法是setButton1/2/3……
範例2:點擊出現帶列表的對話方塊
思路:builder中利用setItems(),其中第一個引數是傳入的資料,第二個引數是新增的點選事件,監聽第幾個列表子項被點選。
注:setItems(),中的點選事件仍舊是用DialogInterface.OnClickListener()。
AlertDialog.Builder builderList = new AlertDialog.Builder(MainActivity.this);
builderList.setTitle("請選擇:");
builderList.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int which) {
Toast.makeText(getApplicationContext(), "點選了第"+which+"個", Toast.LENGTH_SHORT).show();
}
});
builderList.create().show();
結果演示:
範例3:帶單選框的對話方塊
思路:1.builder中利用setSingleChoiceItems(資料,預設選中的項,點選事件仍用DialogInterface.OnClickListener());2.其中重寫的onClick()方法中引數int型which是選中的位置。
AlertDialog.Builder builderRadio = new AlertDialog.Builder(MainActivity.this);
builderRadio.setTitle("單選框");
builderRadio.setSingleChoiceItems(itemsRadio, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int which) { //選中單選框的子項時
str=itemsRadio[which];
Toast.makeText(getApplicationContext(), "選中了"+itemsRadio[which], Toast.LENGTH_SHORT).show();
}
});
builderRadio.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {//確定時,將點選得到的字元重寫到按鈕處。
mButnDialogRadio.setText("你選中了"+str);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
});
builderRadio.create().show();
結果演示:
範例4:帶多選框的對話方塊
思路:利用setMultiChoiceItems()方法,引數1:資料;引數2:存放選中子項的true和false,引數3:點選事件仍為DialogInterface.OnMultiChoiceClickListener()
注:
1>需要一個數據來存放被選中的子項的true和false,來管理,可以確定那個被選中了
AlertDialog.Builder builderCheck = new AlertDialog.Builder(MainActivity.this);
builderCheck.setMultiChoiceItems(items,mIsChecked, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface arg0, int which, boolean isChecked) {
mIsChecked[which]=isChecked;
Log.d("message", "第"+which+"個是"+isChecked);
}
});
builderCheck.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {//確定時,將所有選中的選項新增到一個buffer中
mstringBuffer = new StringBuffer();//每點選時建立新物件
for(int i=0;i<mIsChecked.length;i++){//迴圈資料判斷,當為true即選中時,將資料加到buffer中
if(mIsChecked[i]){
mstringBuffer.append(items[i]);
}
}
//將buffer中所有的資料顯示到按鈕上
mButtonDialogChecked.setText(mstringBuffer);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
});
builderCheck.show();
結果演示:
範例5:自定義dialog
思路:
1)由於builder是已經是創好的view。區域已經規定好,這裡不用builder來自定義。直接新建dialog
2)利用dialog的setContentView(view);利用flater
小知識:對話方塊消失:物件.dismiss();
xml:自定義的佈局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_titile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/liminhao"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_cacel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消"/>
<Button
android:id="@+id/btn_ok"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="確定"/>
</LinearLayout>
</LinearLayout>
java:
dialog_ziding = new Dialog(MainActivity.this);
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.mydialog, null);
TextView titile = (TextView) view.findViewById(R.id.textView_titile);
Button cacel = (Button) view.findViewById(R.id.btn_cacel);
Button ok = (Button) view.findViewById(R.id.btn_ok);
titile.setText("這是一個自定義的對話方塊");
cacel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog_ziding.dismiss();
}
});
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast.makeText(getApplicationContext(), "已經確定", Toast.LENGTH_SHORT).show();
dialog_ziding.dismiss();
}
});
dialog_ziding.setContentView(view);
dialog_ziding.show();
break;
結果演示:
注:標題欄還是利用dialog中的settile()。
範例5的延伸:1.)對按鈕和對話方塊背景樣式進行自定義
方法:在drawable中建立xml檔案,利用shape更改其圓角、實體、邊框屬性:(注:大小的值可以都存放到resource中的dimens中,方便以後更改)
radius=”” //設定圓角大小
solid=“” //實體的設定,可以設定其顏色@coloar
stroke=“” //設定邊框 ,可以設定其顏色和寬度
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5dp"/>
<solid android:color="@color/green"/>
<stroke android:color="@color/white" android:width="3dp"/>
</shape>
2.)對話方塊自定義背景時,需要去掉原來預設的背景,方法:
1>在style中設定:這是設定的name=”NoDialogTitle”
2>在activity中新建對話方塊時,需要用另一個建構函式,傳入R.style.名稱。dialog_ziding = new Dialog(MainActivity.this,R.style.NoDialogTitle);
<style parent="@android:Theme.Dialog" name="NoDialogTitle">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
經過一系列更改,結果演示:
附:style:
<1>概述:
style是專門用於給app,dialog,textview等寫介面風格的,常加到xml設定的最後一行。
<2>style格式:
<style name="TextViewStyle">
<item name="android:background">#00ff00</item>
<item name="android:padding">5dp</item>
</style>
用時:
style="@style/TextViewStyle"
DatePickerDialog(日期選擇對話方塊)、TimePickerDialog(時間選擇對話方塊)
1.概述:
DatePickerDialog顯示年月日;TimePickerDialog顯示分鐘秒。
2用法:
步驟:
1)通過new關鍵字建立例項
2)為其繫結監聽器
3)show()方法顯示。
範例:
功能:點選按鈕,彈出日曆。選擇時間,確定時出現提示時間。
思路:這裡用Calendar來獲取的時間,否則,在傳入時月是從0開始的。且這裡用到轉型。
mCalendar = Calendar.getInstance();
DatePickerDialog pickerDialog = new DatePickerDialog(MainActivity.this, new OnDateSetListener() {
@Override
public void onDateSet(DatePicker arg0, int year, int month, int day) {
mCalendar.set(year, month, day);//將點選獲得的年月日獲取到calendar中。
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");//轉型
Toast.makeText(getApplicationContext(), format.format(mCalendar.getTime()), Toast.LENGTH_LONG).show();
}
}, mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH));
pickerDialog.show();
TimePickerDialog範例:和DatePickerDialog一樣。
mCalendar = Calendar.getInstance();
TimePickerDialog pickerDialog = new TimePickerDialog pickerDialog = new TimePickerDialog(MainActivity.this, new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker arg0, int hour, int minite) {
mCalendar.set(Calendar.HOUR_OF_DAY, hour);//設定時間的另一種方式
mCalendar.set(Calendar.MINUTE, minite);
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH:mm");//轉型
Toast.makeText(getApplicationContext(), format.format(mCalendar.getTime()), Toast.LENGTH_LONG).show();
}
}, mCalendar.get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE), true);
pickerDialog.show();
結果:
小結:這裡用到了
calendar的建立方式:getInstance();
設定時間set(年,月,日)或者set(哪個量field,要變成的值value);
造型SimpleDateFormat。使用.format(時間).
ProgressDialog(進度對話方塊)
PopupWindow:
1.概述:
可以建立類似對話方塊風格的視窗。可以實現將建立的對話方塊視窗下拉顯示,或者在指定位置顯示,所以非常適合顯示一些需要浮動的內容。
與Dialog的區別:
PopupWindow必須要有個View,用setContentView()來新增,而Dialog是有預設的介面的。
2.用法:
- 步驟:
1>呼叫PopupWindow構造器建立PopupWindow物件。
2>必須有個佈局檔案,作為彈出視窗的佈局
3>必須設定popup視窗的寬度和高度:setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
4>利用setContentView()新增view
5)呼叫showAsDropDown(View v)將視窗做誒v元件的下拉元件顯示;
或者呼叫showAtLocation()方法將視窗在指定位置顯示。 - 其他方法:
setOutsideTouchable(true);//設定使點選外部可以消失
3.範例:
popup佈局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_pop1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="文字1"/>
<TextView
android:id="@+id/textView_pop2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="文字2"/>
<TextView
android:id="@+id/textView_pop3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="文字3"/>
</LinearLayout>
java:
popup = new PopupWindow(SecondActivity.this);
View view = getLayoutInflater().inflate(R.layout.popup, null);
popup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); //設定popup的寬度(必須設定)
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setContentView(view);
popup.setOutsideTouchable(true);//設定使點選外部可以消失
popup.showAsDropDown(v);
延伸:監聽手機Back按鍵:
//重寫方法,當Back鍵按下時處理事件。
//重寫方法,使點選Back鍵時能使pop消失。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//按鍵按下時執行此方法
if(keyCode==KeyEvent.KEYCODE_BACK){//當返回鍵按下時
if(popup!=null&&popup.isShowing()){//再判斷popup視窗如果不為空,而且正在執行,那麼關閉掉。注意一定用短路與&&,
popup.dismiss();
return true; //必須返回true,否則不響應。
}
}
return super.onKeyDown(keyCode, event);
}
結果演示: