1. 程式人生 > >對話方塊之AlertDialog、DatePickerDialog(日期選擇對話方塊)、TimePickerDialog(時間選擇)、ProgressDialog(進度)、PopupWindow

對話方塊之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(進度對話方塊)

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);
    }

結果演示:
這裡寫圖片描述