Dialog詳解(包括進度條、PopupWindow、自定義view、自定義樣式的對話框)


Android中提供了多種對話框,在實際應用中我們可能會需要修改這些已有的對話框。本實例就是從實際出發,展現了andorid中大部分對話框,代碼中用了一個對話框管理類來做封裝,其中還定義了對話框的動畫、自定義樣式等等。

 

主布局文件(全是button)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <Button
                android:id="@+id/simple_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="最簡單的對話框" />

            <Button
                android:id="@+id/list_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="列表對話框" />

            <Button
                android:id="@+id/singleChoice_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="單選對話框" />

            <Button
                android:id="@+id/multiChoice_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="多選對話框" />

            <Button
                android:id="@+id/adapter_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="用適配器創建的對話框" />

            <Button
                android:id="@+id/view_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="自定義視圖的對話框" />

            <Button
                android:id="@+id/progress_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="有進度條的對話框" />

            <Button
                android:id="@+id/activity_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="用Activity作的對話框" />

            <Button
                android:id="@+id/popup_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="用PopupWindow創建的對話框" />

            <Button
                android:id="@+id/date_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="選擇日期的對話框" />

            <Button
                android:id="@+id/time_button_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="buttonListener"
                android:text="選擇時間的對話框" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

 

自定義對話框視圖

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#f5f5f5"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp" >

            <ImageView
                android:id="@+id/dialog_imageView_id"
                android:layout_width="match_parent"
                android:layout_height="3dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:background="#ffd060" />

            <TextView
                android:id="@+id/dialog_textView_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="自定義布局"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="#50c0e9" />
        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/my_input_box"
            android:paddingLeft="20dp"
            android:paddingRight="20dp" >

            <EditText
                android:id="@+id/dialog_username_EditText_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:background="@null"
                android:ems="10"
                android:hint="學號/賬號"
                android:inputType="number" >

                <requestFocus />
            </EditText>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:background="@drawable/my_input_box"
            android:paddingLeft="20dp"
            android:paddingRight="20dp" >

            <EditText
                android:id="@+id/dialog_password_EditText_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:background="@null"
                android:ems="10"
                android:hint="密碼"
                android:password="true" />
        </LinearLayout>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginTop="10dp"
            android:background="#bababa" />

        <Button
            android:id="@+id/dialog_logout_button_id"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:background="@drawable/layout_selector"
            android:gravity="center_horizontal"
            android:text="確定"
            android:textColor="#535252"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>

 

MainActivity.java

package com.kale.dialog;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity {

    DialogManager dm;
    String msg = "內容";
    String[] str = new String[] { "android", "java", "ios" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dm = new DialogManager(this);

        
    }

    public void buttonListener(View v) {
        dm = new DialogManager(this);
        switch (v.getId()) {
        case R.id.simple_button_id:
            dm.simpleDialog("最簡單的對話框", msg);
            break;
        case R.id.list_button_id:
            dm.listDialog("列表對話框", str);
            break;
        case R.id.singleChoice_button_id:
            dm.singleChoiceDialog("單選對話框", str);
            break;
        case R.id.multiChoice_button_id:
            dm.MultiChoiceDialog("多選對話框", str);
            break;
        case R.id.adapter_button_id:
            dm.adapterDialog("用適配器建立的對話框", str);
            break;
        case R.id.view_button_id:
            dm.viewDialog("采用自定義視圖的對話框");
            break;
        case R.id.progress_button_id:
            dm.progressDialog("含進度條的對話框",msg);
            break;
        case R.id.activity_button_id:
            startActivity(new Intent(MainActivity.this,DialogActivity.class));
            break;
        case R.id.popup_button_id:
            dm.popupWindowDialog("PopupWindows對話框", v);
            break;
        case R.id.date_button_id:
            dm.dateDialog();
            break;
        case R.id.time_button_id:
            dm.timeDialog();
            break;            
        default:
            break;
        }
    }

}

 

 

 

現在我們分步講解下各種對話框:

首先是一個公用的初始化設置和監聽器設置

private Context mContext;
    private AlertDialog.Builder builder;

    public DialogManager(Context context) {
        mContext = context;
        builder = new AlertDialog.Builder(mContext);
    }

    /**
     * 設置對話框的標題+圖標+按鈕
     * 
     * @param title
     */
    private void setButton(String title) {
        builder.setTitle(title).setIcon(R.drawable.ic_launcher)
                .setPositiveButton("好", new positiveListener())
                .setNeutralButton("中", new NeutralListener())
                .setNegativeButton("差", new NegativeListener());
        // .setCancelable(false);//設置點擊空白處,不能消除該對話框
    }

    /**
     * @author:Jack Tony
     * @tips : 監聽器
     * @date :2014-7-25
     */
    private class positiveListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            // dialog.dismiss();//設置對話框強制退出
            showToast("好");

        }
    }

    private class NeutralListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            showToast("中");
        }
    }

    private class NegativeListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            showToast("差");
        }
    }

    private void showToast(String msg) {
        Toast.makeText(mContext, msg, 0).show();
    }

 

簡易對話框

    /**
     * 簡易對話框
     * 
     * @param title
     * @param msg
     */
    public void simpleDialog(String title, String msg) {
        setButton(title);
        builder.setMessage(msg).create().show();
    }

 

列表對話框

/**
     * 列表對話框
     * 
     * @param title
     * @param str
     */
    public void listDialog(String title, final String[] str) {
        setButton(title);
        // 設置了列表就不能設置內容了,否則就會出問題
        builder.setItems(str, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("選中了:" + str[which]);
            }
        }).create().show();
    }

 

單選對話框

/**
     * 單選對話框
     * 
     * @param title
     * @param str
     */
    public void singleChoiceDialog(String title, final String[] str) {
        setButton(title);
        builder
        // 設置選中了第二項
        .setSingleChoiceItems(str, 1, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("選中了:" + str[which]);
            }
        }).create().show();
    }

 

多選對話框

    /**
     * 多選對話框
     * 
     * @param title
     * @param str
     */
    public void MultiChoiceDialog(String title, final String[] str) {
        setButton(title);
        builder
        // 默認選中幾項
        .setMultiChoiceItems(str, new boolean[] { true, false, true },
                new OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which,
                            boolean isChecked) {
                        showToast("你選擇的id為" + which + " , " + "選中了:"
                                + str[which]);
                    }
                }).create().show();
    }

 

適配器對話框(可以用各種適配器,比如SimpleAdapter)

    /**
     * 適配器對話框
     * 
     * @param title
     * @param str
     */
    public void adapterDialog(String title, final String[] str) {
        setButton(title);
        builder.setAdapter(
                new ArrayAdapter<String>(mContext,
                        android.R.layout.simple_list_item_multiple_choice, str),
                new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        showToast("選中了:" + str[which]);
                    }
                }).create().show();
    }

 

自定義視圖的對話框

/**
     * 自定義視圖對話框
     * 
     * @param title
     */
    public void viewDialog(String title) {
        // LayoutInflater是用來找layout文件夾下的xml布局文件,並且實例化
        LayoutInflater factory = LayoutInflater.from(mContext);
        // 把activity_login中的控件定義在View中
        View view = factory.inflate(R.layout.dialog_layout, null);
        // 將LoginActivity中的控件顯示在對話框中

        // 獲取用戶輸入的“用戶名”,“密碼”
        // 注意:view.findViewById很重要,因為上面factory.inflate(R.layout.activity_login,
        // null)將頁面布局賦值給了view了
        TextView titleTv = (TextView) view
                .findViewById(R.id.dialog_textView_id);
        titleTv.setText(title);
        Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showToast("按下自定義視圖的按鈕了~");
            }
        });

        builder
        // 設定顯示的View
        .setView(view);
        // 設置dialog是否為模態,false表示模態,true表示非模態
        // ab.setCancelable(false);
        // 對話框的創建、顯示,這里顯示的位置是在屏幕的最下面,但是很不推薦這個種做法,因為距底部有一段空隙
        AlertDialog dialog = builder.create();
        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM); // 此處可以設置dialog顯示的位置
        window.setWindowAnimations(R.style.myAnimationstyle); // 添加動畫
        dialog.show();
    }

 

進度條對話框(這里可以定義顯示精准進度的、模糊進度的、圓形模糊進度的進度條)

    /**
     * 進度條對話框
     * 
     * @param title
     * @param msg
     */
    public void progressDialog(String title, String msg) {
        final ProgressDialog dialog = new ProgressDialog(mContext);
        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setCancelable(false);// 設置點擊空白處也不能關閉該對話框

        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//設置采用圓形進度條

        dialog.setMax(100);
        // dialog.setIndeterminate(true);//設置不顯示明確的進度
        dialog.setIndeterminate(false);// 設置顯示明確的進度

        dialog.setButton(ProgressDialog.BUTTON_POSITIVE, "確定",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.setButton(ProgressDialog.BUTTON_NEUTRAL, "中立",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.show();

        //啟動線程,模擬一個耗時的操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                int Progress = 0;
                while (Progress < 100) {
                    try {
                        Thread.sleep(100);
                        Progress++;
                        // dialog.setProgress(Progress);
                        dialog.incrementProgressBy(1);// 進度條一次加10
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                dialog.dismiss();// 完成后消失
            }
        }).start();
    }

 

用PopupWindow做的對話框,PopupWindow特別適合顯示從特定位置彈出的的菜單。我這里設置對話框是從底部彈出,用了一些動畫效果。

/**
     * PopupWindow做的對話框 感謝: http://www.apkbus.com/android-56965-1-1.html
     * http://blog.csdn.net/zhufuing/article/details/17783333
     * http://www.open-open.com/lib/view/open1379383271818.html
     * 
     * @param title
     * @param v
     */
    public void popupWindowDialog(String title, View v) {
        // 裝載布局文件
        View view = LayoutInflater.from(mContext).inflate(
                R.layout.dialog_layout, null);
        // 創建PopupWindow對象,添加視圖,設置寬高,最后一個參數為設置點擊屏幕空白處(按返回鍵)對話框消失。
        // 也可以用.setFocusable(true);.
        final PopupWindow pWindow = new PopupWindow(view,
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
        pWindow.setBackgroundDrawable(new BitmapDrawable());// 為了讓對話框點擊空白處消失,必須有這條語句
        pWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 出現輸入法時,重新布局
        pWindow.setAnimationStyle(R.style.myAnimationstyle);// 設置動畫

        TextView titleTv = (TextView) view
                .findViewById(R.id.dialog_textView_id);
        titleTv.setText(title);
        Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showToast("按下PopupWindow中的按鈕了~");
                pWindow.dismiss();
            }
        });
        // 用下拉方式顯示
        // pWindow.showAsDropDown(v);
        pWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
    }

動畫效果和style文件

動畫文件的目錄 res/anim

dialog_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="200"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

</set>

dialog_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="50%p" />

</set>

樣式文件的目錄:values/styles.xml

<resources>
    
     <style name="myAnimationstyle" parent="android:Animation">  
        <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>  
        <item name="@android:windowExitAnimation">@anim/dialog_exit</item>  
    </style>  
</resources>

 

日期對話框

/**
     * 日期對話框
     */
    public void dateDialog() {
        Calendar c = Calendar.getInstance();
        DatePickerDialog dialog = new DatePickerDialog(mContext,
                new DatePickerDialog.OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker dp, int year, int month,
                            int dayOfMonth) {
                        showToast(year + "-" + (month + 1) + "-" + dayOfMonth);
                    }
                }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
                c.get(Calendar.DAY_OF_MONTH));
        dialog.show();
    }

 

時間對話框

    /**
     * 時間對話框
     */
    public void timeDialog() {
        Calendar c = Calendar.getInstance();
        new TimePickerDialog(mContext,
                new TimePickerDialog.OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker arg0, int hourOfDay,
                            int minute) {
                        showToast(hourOfDay + ":" + minute);
                    }
                }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true)
                .show();
    }

 

用Activit做的對話框

DialogActivity.java

package com.kale.dialog;

import android.app.Activity;
import android.os.Bundle;

public class DialogActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_layout);
    }
}

 

首先,定義風格

    <!-- android Dialog去掉標題欄 和邊框 -->
     <style name="myDialogTheme" parent="android:Theme.Dialog">
        <item name="android:windowFrame">@null</item><!--邊框-->
        <item name="android:windowIsFloating">true</item><!--是否浮現在activity之上-->
        <item name="android:windowIsTranslucent">true</item> <!-- 是否透明 -->
        <item name="android:windowNoTitle">true</item><!--除去title-->
        <item name="android:windowContentOverlay">@null</item> <!-- 對話框是否有遮蓋 -->
        <item name="android:backgroundDimEnabled">false</item><!-- 不允許對話框的背景變暗 -->
        <item name="android:windowBackground">@null</item><!--除去背景色-->
    </style> 

然后,在AndroidManifest.xml中給activity設置風格

        <activity 
            android:name="com.kale.dialog.DialogActivity"
            android:theme="@style/myDialogTheme">
        </activity>

最后,啟動這個activity即可

startActivity(new Intent(MainActivity.this,DialogActivity.class));

 

下面是DialogManager.java工具類的全部代碼

package com.kale.dialog;

import java.util.Calendar;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.graphics.drawable.BitmapDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public class DialogManager {

    private Context mContext;
    private AlertDialog.Builder builder;

    public DialogManager(Context context) {
        mContext = context;
        builder = new AlertDialog.Builder(mContext);
    }

    /**
     * 簡易對話框
     * 
     * @param title
     * @param msg
     */
    public void simpleDialog(String title, String msg) {
        setButton(title);
        builder.setMessage(msg).create().show();
    }

    /**
     * 列表對話框
     * 
     * @param title
     * @param str
     */
    public void listDialog(String title, final String[] str) {
        setButton(title);
        // 設置了列表就不能設置內容了,否則就會出問題
        builder.setItems(str, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("選中了:" + str[which]);
            }
        }).create().show();
    }

    /**
     * 單選對話框
     * 
     * @param title
     * @param str
     */
    public void singleChoiceDialog(String title, final String[] str) {
        setButton(title);
        builder
        // 設置選中了第二項
        .setSingleChoiceItems(str, 1, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("選中了:" + str[which]);
            }
        }).create().show();
    }

    /**
     * 多選對話框
     * 
     * @param title
     * @param str
     */
    public void MultiChoiceDialog(String title, final String[] str) {
        setButton(title);
        builder
        // 默認選中幾項
        .setMultiChoiceItems(str, new boolean[] { true, false, true },
                new OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which,
                            boolean isChecked) {
                        showToast("你選擇的id為" + which + " , " + "選中了:"
                                + str[which]);
                    }
                }).create().show();
    }

    /**
     * 適配器對話框
     * 
     * @param title
     * @param str
     */
    public void adapterDialog(String title, final String[] str) {
        setButton(title);
        builder.setAdapter(
                new ArrayAdapter<String>(mContext,
                        android.R.layout.simple_list_item_multiple_choice, str),
                new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        showToast("選中了:" + str[which]);
                    }
                }).create().show();
    }

    /**
     * 自定義視圖對話框
     * 
     * @param title
     */
    public void viewDialog(String title) {
        // LayoutInflater是用來找layout文件夾下的xml布局文件,並且實例化
        LayoutInflater factory = LayoutInflater.from(mContext);
        // 把activity_login中的控件定義在View中
        View view = factory.inflate(R.layout.dialog_layout, null);
        // 將LoginActivity中的控件顯示在對話框中

        // 獲取用戶輸入的“用戶名”,“密碼”
        // 注意:view.findViewById很重要,因為上面factory.inflate(R.layout.activity_login,
        // null)將頁面布局賦值給了view了
        TextView titleTv = (TextView) view
                .findViewById(R.id.dialog_textView_id);
        titleTv.setText(title);
        Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showToast("按下自定義視圖的按鈕了~");
            }
        });

        builder
        // 設定顯示的View
        .setView(view);
        // 設置dialog是否為模態,false表示模態,true表示非模態
        // ab.setCancelable(false);
        // 對話框的創建、顯示,這里顯示的位置是在屏幕的最下面,但是很不推薦這個種做法,因為距底部有一段空隙
        AlertDialog dialog = builder.create();
        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM); // 此處可以設置dialog顯示的位置
        window.setWindowAnimations(R.style.myAnimationstyle); // 添加動畫
        dialog.show();
    }

    /**
     * 進度條對話框
     * 
     * @param title
     * @param msg
     */
    public void progressDialog(String title, String msg) {
        final ProgressDialog dialog = new ProgressDialog(mContext);
        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setCancelable(false);// 設置點擊空白處也不能關閉該對話框

        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//設置采用圓形進度條

        dialog.setMax(100);
        // dialog.setIndeterminate(true);//設置不顯示明確的進度
        dialog.setIndeterminate(false);// 設置顯示明確的進度

        dialog.setButton(ProgressDialog.BUTTON_POSITIVE, "確定",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.setButton(ProgressDialog.BUTTON_NEUTRAL, "中立",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // 這里添加點擊后的邏輯
                    }
                });
        dialog.show();

        //啟動線程,模擬一個耗時的操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                int Progress = 0;
                while (Progress < 100) {
                    try {
                        Thread.sleep(100);
                        Progress++;
                        // dialog.setProgress(Progress);
                        dialog.incrementProgressBy(1);// 進度條一次加10
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                dialog.dismiss();// 完成后消失
            }
        }).start();
    }

    /**
     * PopupWindow做的對話框 感謝: http://www.apkbus.com/android-56965-1-1.html
     * http://blog.csdn.net/zhufuing/article/details/17783333
     * http://www.open-open.com/lib/view/open1379383271818.html
     * 
     * @param title
     * @param v
     */
    public void popupWindowDialog(String title, View v) {
        // 裝載布局文件
        View view = LayoutInflater.from(mContext).inflate(
                R.layout.dialog_layout, null);
        // 創建PopupWindow對象,添加視圖,設置寬高,最后一個參數為設置點擊屏幕空白處(按返回鍵)對話框消失。
        // 也可以用.setFocusable(true);.
        final PopupWindow pWindow = new PopupWindow(view,
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
        pWindow.setBackgroundDrawable(new BitmapDrawable());// 為了讓對話框點擊空白處消失,必須有這條語句
        pWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 出現輸入法時,重新布局
        pWindow.setAnimationStyle(R.style.myAnimationstyle);// 設置動畫

        TextView titleTv = (TextView) view
                .findViewById(R.id.dialog_textView_id);
        titleTv.setText(title);
        Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                showToast("按下PopupWindow中的按鈕了~");
                pWindow.dismiss();
            }
        });
        // 用下拉方式顯示
        // pWindow.showAsDropDown(v);
        pWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
    }

    /**
     * 日期對話框
     */
    public void dateDialog() {
        Calendar c = Calendar.getInstance();
        DatePickerDialog dialog = new DatePickerDialog(mContext,
                new DatePickerDialog.OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker dp, int year, int month,
                            int dayOfMonth) {
                        showToast(year + "-" + (month + 1) + "-" + dayOfMonth);
                    }
                }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
                c.get(Calendar.DAY_OF_MONTH));
        dialog.show();
    }

    /**
     * 時間對話框
     */
    public void timeDialog() {
        Calendar c = Calendar.getInstance();
        new TimePickerDialog(mContext,
                new TimePickerDialog.OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker arg0, int hourOfDay,
                            int minute) {
                        showToast(hourOfDay + ":" + minute);
                    }
                }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true)
                .show();
    }

    /**
     * 設置對話框的標題+圖標+按鈕
     * 
     * @param title
     */
    private void setButton(String title) {
        builder.setTitle(title).setIcon(R.drawable.ic_launcher)
                .setPositiveButton("好", new positiveListener())
                .setNeutralButton("中", new NeutralListener())
                .setNegativeButton("差", new NegativeListener());
        // .setCancelable(false);//設置點擊空白處,不能消除該對話框
    }

    /**
     * @author:Jack Tony
     * @tips : 監聽器
     * @date :2014-7-25
     */
    private class positiveListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            // dialog.dismiss();//設置對話框強制退出
            showToast("好");

        }
    }

    private class NeutralListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            showToast("中");
        }
    }

    private class NegativeListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            showToast("差");
        }
    }

    private void showToast(String msg) {
        Toast.makeText(mContext, msg, 0).show();
    }
}

 

源碼下載:http://download.csdn.net/detail/shark0017/7676587


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM