天天看點

Android界面程式設計——對話框控件(四)2.5對話框控件

Android界面程式設計——對話框控件

2.5對話框控件

對話框是提示使用者作出決定或輸入額外資訊的小視窗。對話框不會填充螢幕,通常用于需要使用者采取行動才能繼續執行的模式事件。Android中常見跟對話框相關控件有Toast、AlertDialog、PopupWindow、ProgressDialog等

2.5.1 Toast

Toast用于彈出一個簡單文本資訊為應用提供回報,可以和目前活動保持可見和互動,在一定時間後自動消失。Toast有兩種形式基本Toast和自定義Toast,效果如圖2.5.1-1所示:

Android界面程式設計——對話框控件(四)2.5對話框控件

圖2.5.1-1

1、基本Toast的實作

首先通過makeText()執行個體化一個Toast,然後調用show()進行顯示,代碼實作:

Toast toast = Toast.makeText(context, “請檢查網絡連接配接”,

Toast.LENGTH_SHORT.);

toast.show();

2、自定義Toast

如果一個簡單的文本資訊是不夠的,可以為Toast自定義布局并可以設定在螢幕上的顯示位置。

Ø 要建立一個自定義布局,定義視圖的布局

Ø 通過setView()方法加載布局。

下面就通過案例2.5-1,實作如圖2.5-1所示的應用效果

Android界面程式設計——對話框控件(四)2.5對話框控件

圖2.5-1

Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件

2.5.2  AlertDialog

AlertDialog是Dialog的子類,可實作簡單、友善、靈活的建構對話框。AlertDialog可顯示标題、最多三個按鈕、可選擇項清單或自定義布局。AlertDialog

主要有三個布局區域如圖2.5-2所示:

Android界面程式設計——對話框控件(四)2.5對話框控件

 圖2.5-2

AlertDialog實作要點

Ø 實作向AlertDialog添加按鈕

通過調用 setPositiveButton() 和 setNegativeButton() 方法實作為對話框添加按鈕,代碼如下:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

builder.setPositiveButton(“ok”, new DialogInterface.OnClickListener() {

 public void onClick(DialogInterface dialog, int id) {

      }

 });

builder.setNegativeButton(“cancel”, new DialogInterface.OnClickListener() {

 public void onClick(DialogInterface dialog, int id) {

}});

Ø 建立自定義布局

想讓對話框具有自定義布局,需建立一個布局,然後通過調AlertDialog.Builder對象上的 setView()将其添加到 AlertDialog,代碼如下:

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

 LayoutInflater inflater = getActivity().getLayoutInflater();

builder.setView(inflater.inflate(R.layout.dialog_signin, null));

預設情況下,自定義布局會填充對話框視窗,但仍然可以使用 AlertDialog.Builder 方法來添加按鈕和标題。

下面就通過案例2.5-2,實作如圖2.5-3  所示的應用效果

Android界面程式設計——對話框控件(四)2.5對話框控件

圖2.5-3

Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件

2.5.3  PopupWindow

PopupWindow是可在任意位置彈出的對話框,在目前活動的Activity的頂部顯示一個浮動的容器。AlertDialog與PopupWindow的差別:

Ø AlertDialog的位置固定,而PopupWindow的位置可以随意。

Ø AlertDialog是非阻塞線程的,而PopupWindow是阻塞線程的。

PopupWindow的實作:

Ø 建構PopupWindow

  View view= LayoutInflater.from(this).inflate(

R.layout.popuwindow_layout,null);

      mPopupWindow=new PopupWindow(view);

Ø 設定PopupWindow

1、單擊外側區域關閉PopupWindow

顯示PopupWindow之後在外面點選是關閉視窗需進行下列設定,否則點選外面并不會關閉PopupWindow。  

mPopupWindow.setFocusable(true);

ColorDrawable colorDrawable=new ColorDrawable(0);

mPopupWindow.setBackgroundDrawable(colorDrawable);

2、為popupwindow添加動畫

首先在anim中定義動畫資源,并在Style中定義樣式然後使用setAnimationStyle()方法為PopupWindow添加動畫,代碼如下:

進入動畫:

<set xmlns:android="http://schemas.android.com/apk/res/android">

<alpha

        android:fromAlpha="0"

        android:toAlpha="1"

        android:duration="1000"

        />

</set>

退出動畫:

<set xmlns:android="http://schemas.android.com/apk/res/android">

<alpha android:duration="1000"

        android:fromAlpha="1" android:toAlpha="0"/>

</set>

定義樣式:

<style name="popuAnimationStyle">

<item name="android:windowEnterAnimation">@anim/popup_enter

</item>

<item name="android:windowExitAnimation">@anim/popup_out</item>

</style>

設定動畫

mPopupWindow.setAnimationStyle(R.style.popuAnimationStyle);

Ø 彈出PopupWindow

showAsDropDown(view):相對某個控件的位置(正左下方),無偏移

showAsDropDown(view, xoff,  yoff):相對某個控件的位置,有偏移

showAsDropDown(view, xoff, yoff, gravity):相對某個控件的指定位置,有偏移

showAtLocation(parent, gravity, x, y):相對于父控件的指定位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設定偏移或無偏移

下面就通過案例2.5-3,講解PopupWindow的用法

1、實作在控件的正下方彈出菜單

Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件
Android界面程式設計——對話框控件(四)2.5對話框控件

2.5.3 ProgressDialog

帶有進度條(Progressbar)的對話框,該對話框隻能顯示一個文本或一個View加上一個進度條,但文本和View不能同時使用。如果顯示不确定的進度(圓形進度條),則不建議使用ProgressDialog,而應改為在Activity布局中使用

ProgressDialog的幾個方法

1.setMax()

設定對話框中進度條的最大值, 進度的取值範圍為0..10000。

2.setTile()

設定标題。

3.setProgressStyle()

設定對話框中進度條的樣式。例如:環形和水準。

參數:

ProgressDialog.STYLE_SPINNER 環形精度條。

ProgressDialog.STYLE_HORIZONTAL 水準樣式的進度條。

4.setMessage()

設定顯示的内容。

下面就通過案例2.5-4,講解ProgressDialog的用法,執行效果如圖2.5-4

Android界面程式設計——對話框控件(四)2.5對話框控件

圖2.5-4

提示:本例中用于異步任務,請參閱AsyncTask的用法請參閱《第三章 事件處理》異步任務相關内容

public class ProgressDialogActivity extends AppCompatActivity {
    private ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_dialog);
        showProgressDialog();
        new UpdateAsyncTask().execute();
    }
    private void showProgressDialog(){
        //建立ProgressDialog
        progressDialog = new ProgressDialog(ProgressDialogActivity.this);
        //設定ProgressDialog的樣式
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        //設定标題
        progressDialog.setTitle("軟體更新");
        //設定顯示的内容
        progressDialog.setMessage("正在下載下傳");
        //設定最大值
        progressDialog.setMax(100);
        //設定進度值
        progressDialog.setProgress(0);
        //顯示對話框
        progressDialog.show();
    }
    private Integer progress=0;
    private class UpdateAsyncTask extends  AsyncTask<Void,Integer,Void>{
        @Override
        protected Void doInBackground(Void... params) {
            //模拟網絡操作。
           while(progress<100){
                try {
                    Thread.sleep(1000);
                    progress+=10;
                    publishProgress(progress);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            //執行完成之後,關閉對話框。
            progressDialog.dismiss();
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d("jereh","dfdfdf");
            super.onProgressUpdate(values);
            //更改進度條的值
            progressDialog.setProgress(values[0]);
        }
    }
           

代碼參考:

codes\ch02\2.5\CustomDialog\app\src\main\java\com\jerehedu\ProgressDialogActivity.java 

作者:沖天之峰   20160709

繼續閱讀