android基礎學習-android篇day16-Dialog的使用

發條魚發表於2018-09-21

Dialog 的基礎知識

Dialog 對話方塊簡介

Dialog 是 Android 中根據使用者的意向彈出一些提示的資訊,告訴使用者是否要執行該操 作的一種小的窗體。

Dialog 對話方塊的分類

  • 1)  AlertDialog,彈出式對話方塊

  • 2)  ProgressDialog 進度對畫框

  • 3)  DatePickerDialog 對話方塊和 TimerPickerDialog 日期對話方塊

  • 4)  相關下載

    選擇自定義下載,根據我們的需求下載不同的內容 SDK,選擇下載開發包,示

    例程式碼和類參考。

AlertDialog 如何建立

Android 中彈出式對話方塊是通過自己內部類 builder 來實現的,通過 builder 可以設 置一系列對話方塊的引數,呼叫 Create()方法就可以建立,具體在程式碼中展示。

       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("設定字型顏色");//設定標題
        builder.setIcon(android.R.drawable.btn_star);//設定圖示
        //setItems(表示資料元的資源id(在string.xml中定義),表示點選item中的選項時觸發的監聽事件)
        builder.setItems(R.array.color_name, new DialogInterface.OnClickListener() {
            //int which  表示點選item的下標從0開始
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        break;
                }
            }
        });
        builder.create().show();
    <string-array name="color_name">
        <item>紅色</item>
        <item>綠色</item>
        <item>藍色</item>
    </string-array>
  •  如何取消對話方塊

呼叫 Cancel()或者 dismiss()方法就可以取消對話方塊

  dialog.dismiss();//選中一項之後,關閉
  • 如何給對話方塊新增列表項

傳統的給對話方塊新增列表項是通過 setitems()方法來實現的,使用者可以點選不同的條目 選擇不同的內容,具體做法是在 string.xml 中新增一個陣列,以下圖為例說明。

    <string-array name="color_name">
        <item>紅色</item>
        <item>綠色</item>
        <item>藍色</item>
    </string-array>

在 setItems()方法中引用這個陣列就可以完成,具體引用如下圖所示:

  builder.setItems(R.array.color_name, new DialogInterface.OnClickListener() {
            //int which  表示點選item的下標從0開始
            @Override
            public void onClick(DialogInterface dialog, int which) {
             
            }
        });

。 該方法中的第一個引數是我們在 string.xml 中定義的資料列表項,第二個引數是點選事件,一定是 DialogInterface 下的點選事件

 為對話方塊新增單選項的列表項

對列表項新增單選項和之前沒有多大的區別,就是給 builder 設定了 setSingleChoice() 方法

  1. 第一個引數是我們在 string,xml 下定義的陣列
  2. 第二個引數時系統子自帶的佈局,通常是 android.R.layout.simple_selectable_list_item
  3. 第三個引數任然是對話方塊 的點選事件,程式碼如下圖所示:

setSingleChoiceItems(資料來源id(string.xml中定義),表示預設被選中item的下標 (-1表示沒有預設選中),點選單選item的監聽事件)

      AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("設定字型大小");
        builder.setIcon(android.R.drawable.btn_star);
        //拿到字號大小的陣列
       final String[] fontValues=getResources().getStringArray(R.array.font_size);
        builder.setSingleChoiceItems(R.array.font_name, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                tv.setTextSize(Float.parseFloat(fontValues[i]));//將string裝成float
                dialog.dismiss();//選中一項之後,關閉//dialog是一個全域性AlertDialog物件

            }
        });
        dialog=builder.create();
        dialog.show();

為對話方塊新增多選框的列表項

建立對話方塊,設定一系列屬性,然後設定 setMultipleChoice()就可以實現,但是需要 注意的是該方法的引數

  1. 第一個引數是我們定義的列表項
  2. 第二個引數是一個 boolean 型別的陣列
  3. 第三個引數是點選事件

程式碼如下:

//在string.xml中定義的字串陣列       
String[] knows = getResources().getStringArray(R.array.knowledge);

進度條對話方塊

進度條對話方塊是一種常用的對話方塊,通常是當使用者請求網路時顯示的一種對話方塊,

第一 種對話方塊是一種預設的圓形進度條的對話方塊,實現程式碼如下:

final ProgressDialog pdl=new ProgressDialog(MainActivity.this); 

pdl.setTitle("點我下載啊"); 

pdl.setIcon(R.drawable.prog);

pdl.setCancelable(false);//設定無論點選哪些區域,對話方塊都不會消失

水平的帶有進度條的對話方塊

final ProgressDialog pdl=new ProgressDialog(MainActivity.this); 

pdl.setTitle("點我下載啊"); 

pdl.setIcon(R.drawable.prog);

//設定對話方塊的樣式是水平顯示的 

pdl.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

//設定無論點選哪些區域,對話方塊都不會消失

pdl.setCancelable(false);

 帶有進度條的對話方塊,並且進度條是可變化的對話方塊

這是類似網路下載資料時的一個 操作,當開始下載時進度條顯示為零,當下下載完成時進度條的進度為 100,並且文字 域的文字變為下載完成,該過程是通過執行緒來完成的,具體程式碼如下:

 自定義對話方塊

在安卓開發中,時常遇到要彈窗提醒的情況。而系統自帶的彈出對話方塊由不是很美觀,可以通過自己繼承對話方塊類(Dialog),並設定自定義的佈局檔案,來達到美化彈出式對話方塊的目的。

  • 首先是自定義一個對話方塊類,繼承自 Dialog,然後再建構函式中傳入對話方塊顯示內容、 按鈕響應函式等引數:
  • 在自定義對話方塊類的 OnCreate 函式中,設定對話方塊的佈局,以及顯示風格:通常是自己定義對話方塊的頭部和內容部分,然後將其載入進來設定給對話方塊,並顯示
  • 另外,自定義的對話方塊類 UserDefinedDialog 同時實現了 OnClickListener 介面,用於實現對點選對話方塊上按鈕的響應,在響應函式中,會判斷在構造該類的時候 是否傳入了相應的響應函式,並交由該函式處理:

DatePickerDialog日期對話方塊

需要注意的是 DatePickerDialog 對話方塊構造方法中的參數列示的意義,該方法中共有 5 個引數

  1. 分別是上下文物件
  2. 日期設定的監聽器
  3. 當前的年份
  4. 當前的月份
  5. 當前的日期數,

寫好後展示對話方塊就可以了。 日期對話方塊的基本使用如下程式碼所示

DatePickerDialog dll=new
DatePickerDialog(MainActivity.this, new
DatePickerDialog.OnDateSetListener() {
@Override

    public void onDateSet(DatePicker view, final int year,
final int monthOfYear, final int dayOfMonth) {
    }
},Calendar.DAY_OF_YEAR,Calendar.DAY_OF_MONTH,Calendar.DATE
);
dll.show();

時間設定對話方塊的基本用法

需要注意的還是構造方法中引數的問題,該方法中公有 5 個引數分別表示

  1. 上下文物件,
  2. 時間設定的監聽器
  3. 當前的小時數
  4. 當前的分鐘數
  5. 是否採用 24 進位制的計數法。
TimePickerDialog tdl=new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {

@Override

       public void onTimeSet(TimePicker view, int hourOfDay,
   int minute) {
       }
   },Calendar.HOUR_OF_DAY,Calendar.MINUTE,false);
   tdl.show();

 

綜合案例:

string.xml//定義字串陣列

<resources>
    <string name="app_name">alertDialogList</string>
    <string name="str_color">設定字型顏色</string>
    <string name="str_setting">進行設定</string>
    <string name="str_size">設定字型大小</string>

    <string-array name="color_name">
        <item>紅色</item>
        <item>綠色</item>
        <item>藍色</item>
    </string-array>
    <!--設定文字-->
    <string-array name="setting_name">
        <item>WIFI設定</item>
        <item>藍芽設定</item>
        <item>聲音設定</item>
        <item>日期設定</item>
    </string-array>
    <string-array name="setting_images">
        <item>img01</item>
        <item>img02</item>
        <item>img03</item>
        <item>img04</item>
    </string-array>
    <string-array name="font_name">
        <item>小號</item>
        <item>中號</item>
        <item>大號</item>
        <item>特大號</item>
    </string-array>
    <string-array name="font_size">
        <item>15</item>
        <item>20</item>
        <item>25</item>
        <item>30</item>
    </string-array>
</resources>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<Button
    android:id="@+id/bt_list"
    style="@style/bt_name"
    android:text="@string/str_color"/>
    <Button
    android:id="@+id/bt_setting"
    style="@style/bt_name"
    android:text="@string/str_setting"
    android:layout_below="@+id/bt_list"
    />
    <Button
        android:id="@+id/bt_size"
        style="@style/bt_name"
        android:text="@string/str_size"
        android:layout_below="@+id/bt_setting"
        />
    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="#999"
        android:gravity="center"
        android:text="Hello World"
        android:layout_below="@+id/bt_size"/>


</RelativeLayou

list_items.xml//顯示圖示列表Dialog的一個佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ImageView
    android:id="@+id/iv_logo"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:src="@drawable/img01"
    />
 <TextView
     android:id="@+id/tv_name"
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:layout_weight="1"
     android:text="Tv"/>
</LinearLayout>

MainActivity.java

package com.demo.alertdialoglist;

import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 演示AlertDialog各種列表形式
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button bt_list, bt_setting, bt_size;
    private TextView tv;
    private int CheckItemId = 0;
    private AlertDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    public void initView() {
        bt_list = findViewById(R.id.bt_list);
        tv = findViewById(R.id.tvInfo);
        bt_list.setOnClickListener(this);//繫結監聽器
        bt_setting = findViewById(R.id.bt_setting);
        bt_setting.setOnClickListener(this);
        bt_size = findViewById(R.id.bt_size);
        bt_size.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_list://設定字型的顏色
                showCommonListDialog();
                break;
            case R.id.bt_setting://設定介面
                showAdapterListDialog();
                break;
            case R.id.bt_size:
                showSingleListDialog();//設定字型大小
                break;

        }
    }


    /**
     * 展示介面卡列表dialog
     */
    public void showAdapterListDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("開啟設定");
        builder.setIcon(android.R.drawable.btn_star);
        //構建資料data
        //獲取名稱陣列
        String[] stringNames = getResources().getStringArray(R.array.setting_name);
        //獲取圖片陣列
        String[] imageNames = getResources().getStringArray(R.array.setting_images);

        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < stringNames.length; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("setting", stringNames[i]);
            //getIdentifier() 根據資源的名稱和型別獲取資源的id
            int imageId = getResources().getIdentifier(imageNames[i], "drawable", getPackageName());
            map.put("image", imageId);
            data.add(map);
        }

        SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item,
                new String[]{"setting", "image"},
                new int[]{R.id.tv_name, R.id.iv_logo});
        //setAdapter(載入介面卡物件,點選列表項出發事件)
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = null;
                switch (which) {
                    case 0://wifi
                        intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                        break;
                    case 1://藍芽
                        intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
                        break;
                    case 2://聲音
                        intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
                        break;
                    case 3://日期
                        intent = new Intent(Settings.ACTION_DATE_SETTINGS);
                        break;
                }
                startActivity(intent);
            }
        });
        builder.create().show();
    }


    /*
    展示普通列表的Dialog的方法
     */
    public void showCommonListDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("設定字型顏色");
        builder.setIcon(android.R.drawable.btn_star);
        //setItems(表示資料元的資源id,表示點選item中的選項時觸發的監聽事件)
        builder.setItems(R.array.color_name, new DialogInterface.OnClickListener() {
            //int which  表示點選item的下標
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        tv.setTextColor(Color.RED);
                        break;
                    case 1:
                        tv.setTextColor(Color.GREEN);
                        break;
                    case 2:
                        tv.setTextColor(Color.BLUE);
                        break;
                }
            }
        });
        builder.create().show();
    }

    /**
     * 展示單選列表Dialog
     */
    public void showSingleListDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("設定字型大小");
        builder.setIcon(android.R.drawable.btn_star);
        //拿到字號大小的陣列
        final String[] fontValues = getResources().getStringArray(R.array.font_size);
        //setSingleChoiceItems(資料來源id(string.xml中定義),
        // 表示預設被選中item的下標 -1(表示沒有預設選中),點選單選item的監聽事件)
        builder.setSingleChoiceItems(R.array.font_name, CheckItemId, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                tv.setTextSize(Float.parseFloat(fontValues[i]));//將string裝成float
                dialog.dismiss();//選中一項之後,關閉

            }
        });
        dialog = builder.create();
        dialog.show();
        //builder.create().show();

    }


}

 

相關文章