Android中仿IOS提示框的實現


前言

  在Android開發中,我們有時需要實現類似IOS的對話框。今天我就來總結下,如何通過自定義的開發來實現類似的功能。

自定義Dialog

  我們知道Android中最常用的對話框就是Dialog及其派生類。這次我們通過組合的方式來實現一個類似IOS對話框的效果。我們先來看一下布局效果,這個相信大家都能弄出來,在這里我就貼一下最后的效果圖(注意:對話框的邊緣是圓角的)。

  效果圖如下:

  

  我們看到,這個和IOS的對話框已經非常相似了,后面我們需要做的就是將其作為一個組件封裝起來,實現AlertDialog那樣的調用方式提供給調用者使用。下面我們來看一下整個的封裝過程。

1、組合使用Dialog進行對象的構建

  我們來看一下核心代碼:

 1 /**
 2      * 創建BaseDialog實例
 3      * @return
 4      */
 5     public BaseDialog builder(){
 6         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 7         mDialog = new Dialog(mContext, R.style.Dialog);
 8         //設置dialog彈出后會點擊屏幕,dialog不消失;點擊物理返回鍵dialog消失
 9         mDialog.setCanceledOnTouchOutside(false);
10         View layout = inflater.inflate(R.layout.dialog_normal_layout, null);
11         mDialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
ViewGroup.LayoutParams.WRAP_CONTENT));
12 //設置Dialog中展示的msg 13 mMessage=(TextView) layout.findViewById(R.id.txtMsg); 14 //設置確認按鈕的處理事件 15 mPositiveBtnText=(TextView) layout.findViewById(R.id.txtSubmit); 16 mPositiveBtnText.setOnClickListener(new View.OnClickListener() { 17 @Override 18 public void onClick(View v) { 19 if (mPositiveBtnClickListener != null) { 20 mPositiveBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_POSITIVE); 21 } 22 } 23 }); 24 25 mNegativeBtnText=(TextView) layout.findViewById(R.id.txtCancle); 26 mNegativeBtnText.setOnClickListener(new View.OnClickListener() { 27 @Override 28 public void onClick(View v) { 29 if(mNegativeBtnClickListener!=null) { 30 mNegativeBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_NEGATIVE); 31 } 32 } 33 }); 34 mDialog.setContentView(layout); 35 36 return this; 37 }

  在這段代碼中,我們看到第7行代碼生成一個Dialog對象,然后通過解析樣式文件(XML)通過setContentView方法添加到生成的Dialog對象中。下面的代碼我們看到通過解析XML樣式文件,來設置Dialog顯示的文本、取消、確認按鈕觸發的事件等操作。重點在最后一行代碼return this而不是mDialog。因為通過返回this對象我們可以使用“鏈式調用”來不斷的進行調用設置等操作,類似Android中的AlertDialog使用方式。

2、自定義Dialog的一些設置

  

 1 /**
 2      * 設置Msg
 3      * 支持Resource設置
 4      * @param message
 5      */
 6     public BaseDialog setMessage(int message){
 7         mMessage.setText(mContext.getText(message).toString());
 8         return this;
 9     }
10 
11     /**
12      * 設置Msg
13      * @param message
14      */
15     public BaseDialog setMessage(String message){
16         mMessage.setText(message);
17         return this;
18     }
19 
20 
21     public BaseDialog setPositiveButton(int positiveBtnText,DialogInterface.OnClickListener listener) {
22         mPositiveBtnText.setText(mContext.getText(positiveBtnText));
23         mPositiveBtnClickListener = listener;
24         return this;
25     }
26 
27     public BaseDialog setPositiveButton(String positiveBtnText,DialogInterface.OnClickListener listener){
28         mPositiveBtnText.setText(positiveBtnText);
29         mPositiveBtnClickListener=listener;
30         return this;
31     }
32 
33 
34     public BaseDialog setNegativeButton(int negativeBtnText,DialogInterface.OnClickListener listener){
35         mNegativeBtnText.setText(mContext.getText(negativeBtnText));
36         mNegativeBtnClickListener=listener;
37         return this;
38     }
39 
40 
41     public BaseDialog setNegativeButton(String negativeBtnText,DialogInterface.OnClickListener listener){
42         mNegativeBtnText.setText(negativeBtnText);
43         mNegativeBtnClickListener=listener;
44         return this;
45     }
46 
47 
48     public void show(){
49         mDialog.show();
50     }

  我們看到我們提供了幾個比較常用的函數。特別是setPositiveButton等方法,我們直接將事件處理對象傳遞進來了。下面我們來看下自定義控件的字段定義。代碼如下:

 1 public BaseDialog(Context context){
 2         mContext=context;
 3     }
 4 
 5     private Dialog mDialog;
 6     protected Context mContext;
 7     protected TextView mMessage;
 8     protected TextView mPositiveBtnText;
 9     protected TextView mNegativeBtnText;
10     protected DialogInterface.OnClickListener mPositiveBtnClickListener;
11     protected DialogInterface.OnClickListener mNegativeBtnClickListener;

  我們看到整個自定義Dialog的核心就是mDialog對象,通過組合的方式我們在每一個BaseDialog對象內部都會有一個Dialog對象,BaseDailog對象只是提供了一些外圍的顯示功能。核心的例如隱藏、顯示、彈出效果等方式依賴於嵌入的mDialog對象的。

  下面我們來看一下自定義Dialog的調用方式。代碼如下:

/**
 * 彈出電話確認按鈕
 */
new BaseDialog(getActivity())
        .builder()
        .setMessage("15895991339")
        .setPositiveButton("確認", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:15895991339"));
                startActivity(intent);
                dialog.dismiss();
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        }).show();

  我們看到,調用方式和AlertDialog的使用方式很相似。

 


免責聲明!

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



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