1. 程式人生 > >android中的提示框:Dialog以及改變Dialog的顯示位置

android中的提示框:Dialog以及改變Dialog的顯示位置

簡介

提示框(Dialog)在手機APP中,是必不可少的,比如設定些簡單的屬性、進度提醒等。
就提示框(Dialog)而言,可以用兩種方式:①、用android自帶的類去實現;②、按自己的需要建一個xml作為一個對話方塊。
很明顯第一種方法只能實現簡單的對話方塊,程式碼量少;第二種方法可以實現任何想要的對話方塊,程式碼量大

第一種方式的常用簡單的對話方塊

①普通對話方塊:

這裡寫圖片描述

AlertDialog.Builder builder = new AlertDialog.Builder(this);
/*設定主題、內容、按鈕*/
builder.setTitle("普通對話方塊"
).setMessage("是否刪除?").setNegativeButton("否", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { arg0.dismiss(); /*關閉對話方塊*/ } }) .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface arg0, int arg1) { Toast.makeText(MainActivity.this, "刪除成功!", Toast.LENGTH_SHORT).show(); /*提醒測試作用*/ } }); builder.create().show();

注:按鈕分為確定按鈕、取消按鈕和中間按鈕,當然中間按鈕(setNeutralButton)沒有在程式碼上體現。取消按鈕一定在確定按鈕的前面。

②列表對話方塊:

這裡寫圖片描述

final String[] provices = new String[] { "北京", "湖南", "江蘇", "上海", "浙江" };
        AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("選擇省份:");
        /*!注意這裡的方法以及引數哦!*/
        builder.setItems(provices, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                provice = provices[arg1];
                Toast.makeText(MainActivity.this, "選擇的城市為:" + provices[arg1],
                        Toast.LENGTH_SHORT).show();
                        /*提醒測試作用*/
            }
        });
        builder.create().show();

③單選對話方塊:

這裡寫圖片描述

final String[] provices = new String[] { "北京", "湖南", "江蘇", "上海", "浙江" };
        AlertDialog.Builder builder = new Builder(this);

        builder.setTitle("單選按鈕對話方塊");
        /*!注意這裡的方法以及引數喲!"0"表示彈出對話方塊時,第一個是被選中的*/
        builder.setSingleChoiceItems(provices, 0,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        Toast.makeText(MainActivity.this,
                                "選擇的城市是:" + provices[arg1], Toast.LENGTH_SHORT)
                                .show();
                                /*提醒測試作用*/
                    }
                });
        builder.create().show();

④多選對話方塊:

這裡寫圖片描述

final String[] provices = new String[] { "北京", "湖南", "江蘇", "上海", "浙江" };
final boolean[] bs={false,false,false,false,false};
        AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("複選按鈕對話方塊");
        /*!注意這裡的方法以及引數0,boolean陣列的個數要與第一個引數的陣列個數要對應!*/
        builder.setMultiChoiceItems(provices, bs,
                new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1,
                            boolean arg2) {
                        /*注意字串陣列provices和布林陣列bs的一一對應關係*/
                    }
                });
        builder.create().show();

第一種方式較複雜的對話方塊

⑤日期對話方塊

這裡寫圖片描述

OnDateSetListener dateSetListener = new OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
            /*arg1表示年份,arg2表示幾月(比實際月份要少一),arg3表示幾號*/

                Toast.makeText(MainActivity.this,
                        "設定的時間為:" + arg1 + "年" + (arg2 + 1) + "月" + arg3 + "日",
                        Toast.LENGTH_SHORT).show();
                        /*提示檢測作用*/
            }
        };
        /*注意這裡宣告對話方塊的方式與其他的對話方塊的區別*/
        DatePickerDialog datePickerDialog=new DatePickerDialog(this, dateSetListener, 2015, 10, 30);
        datePickerDialog.show();
        /*這裡的第三個引數為年份,第四個為幾月,在對話方塊顯示是11月,自動加一,第五個是幾號*/

⑥進度條對話方塊

這裡寫圖片描述

/*注意這裡宣告對話方塊的方式與其他的對話方塊的區別*/
ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setIcon(R.drawable.ic_launcher);
        progressDialog.setTitle("進度條對話方塊");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        /*這裡表示新增最大進度,後面可以通過setprogress方法修改進度*/
        progressDialog.setMax(100);
        /*這裡的button可以隨便set,不限制個數*/
        progressDialog.setButton("Hide", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface Dialog, int which) {
               //這裡新增點選這個按鈕後的事件
            }
        });
        progressDialog.setButton2("Cancel",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                    //這裡新增點選這個按鈕後的事件
                    }
                });

        progressDialog.show();

注:是不是發現有的dialog是先create然後又show的,其實不create是完全可以滴。。。

第二種方式實現步驟

案例示範:

①主xml檔案新增一個按鈕

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="200dp"
    android:layout_height="150dp"
    >
<Button
    android:id="@+id/bt1" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="提示框"
    />


</RelativeLayout>

②建立settishi.xml檔案做對話方塊(只是簡單的示範)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="150dp" 
    android:background="#FF0000">
    <!--儘量不要在外面在套用佈局,會出現bug。不過在裡面可以隨便套 -->

</RelativeLayout>

③新建SetTiShi.java

public class SetTiShi extends Dialog {
    Context context;

    public SetTiShi(Context context, int theme) {
    /*這裡很重要,按照規定好的格式去執行dialog*/
        super(context, theme);
        // TODO Auto-generated constructor stub
        this.context = context;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settishi);
    }

}

④res/values/styles.xml中新增程式碼

<style name="MyDialog" parent="@android:Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--讀英文就知道啥意思了,把視窗背景改成無色 -->
    </style>

⑤MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bt1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                   jianting();
            }
        });

    }
        /*在onClick中不能直接宣告Dialog*/
    public void jianting() {
        Dialog dialog = new SetTiShi(this, R.style.MyDialog);
        dialog.show();
    }
}

注:這種方法其實也不難,除去程式碼量的問題,它比第一種方法還簡單。就是把一個普通的Activity變成了一個Dialog。這個就不加程式碼了~

附加第三種方式

Dialog mDialog = new Dialog(this);
//建立dialog
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable());
//設定背景顏色
Window win = mDialog.getWindow();
//獲取dialog視窗
win.setContentView(R.layout.set_ip_dialog);
//設定顯示的佈局檔案
mDialog.show();

改變Dialog出現的位置:

Dialog dialog = new Dialog(this);
/*隨意定義個Dialog*/
Window dialogWindow = dialog.getWindow();
/*例項化Window*/
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
/*例項化Window操作者*/
lp.x = 100; // 新位置X座標
lp.y = 100; // 新位置Y座標
dialogWindow.setAttributes(lp);
/*放置屬性*/
dialog.show();
/*show dialog*/

注:另外說一下lp.x和lp.y具體怎麼定位,和數學中座標軸幾乎一模一樣,有四個象限,不過一二象限和三四象限換位置了,預設是在0,0顯示,那就是螢幕中間。象限原點也可以移動。還有一點,要根據實際的Dialog樣式來確定,多測試測試就好了。

注意在Dialog中的按鈕新增監聽事件時的寫法和Activity中新增監聽事件的區別(匯入包的區別)

在宣告一個Dialog物件也可以這樣宣告:

AlertDialog dialog = new AlertDialog.Builder(this).create();

給dialog中新增元件的時候有些不同:
新增Button時需要多加一個引數說明Button的型別,例如:

dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "是",
         new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface arg0, int arg1) {
         // TODO Auto-generated method stub

         }