1. 程式人生 > >自定義控制元件(Dialog篇)

自定義控制元件(Dialog篇)

自定義控制元件實現方式

本文中初步討論了關於原生Dialog實現方式,自定義Dialog樣式實現以及注意細節
基於Android Studio API 23開發
- 原生Dialog三種樣式實現方式
- 自定義Dialog實現方式
- 結束語

原生Dialog實現方式

程式碼塊

原生Dialog實現方式樣式一L提示框:

這裡寫圖片描述

實現方式一:
   AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器  
        builder.setTitle("提示"); //設定標題  
        builder.setMessage("是否確認退出?"
); //設定內容 builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可 builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { //設定確定按鈕 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //關閉dialog } }); builder.setNegativeButton("取消"
, new DialogInterface.OnClickListener() { //設定取消按鈕 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {//設定忽略按鈕 @Override
public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); //引數都設定完成了,建立並顯示出來 (三個按鈕本身是空作用的,需要人為賦值) builder.create().show();
實現方式二:
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){  
           @Override  
           public void onClick(DialogInterface dialog, int which) {  
               switch(which){  
                   case Dialog.BUTTON_POSITIVE:  

                       break;  
                   case Dialog.BUTTON_NEGATIVE:  

                       break;  
                   case Dialog.BUTTON_NEUTRAL:  

                       break;  
               }  
           }  
       };  
       //dialog引數設定  
       AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器  
       builder.setTitle("提示"); //設定標題  
       builder.setMessage("是否確認退出?"); //設定內容  
       builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可  
       builder.setPositiveButton("確認",dialogOnclicListener);  
       builder.setNegativeButton("取消", dialogOnclicListener);  
       builder.setNeutralButton("忽略", dialogOnclicListener);  
       builder.create().show();  

原生Dialog實現方式樣式二L列表選項:

這裡寫圖片描述

    final String items[]={"路飛","娜美","索隆"};  
        //dialog引數設定  
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器  
        builder.setTitle("提示"); //設定標題  
        //builder.setMessage("是否確認退出?"); //設定內容  
        builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可  
        //設定列表顯示,注意設定了列表顯示就不要設定builder.setMessage()了,否則列表不起作用。  
        builder.setItems(items,new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();  
                //which屬性是items陣列的下標
                         }  
        });  
        builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();   
            }  
        });  
        builder.create().show();  

原生Dialog實現方式樣式三L單選對話方塊:

這裡寫圖片描述

    final String items[]={"男","女"};  
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器  
        builder.setTitle("提示"); //設定標題  
        builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可  
        builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                //dialog.dismiss();  
               //setSingleChoiceItems引數中,0表示預設選中是第一個,如圖所示是預設選中“男”。
            }  
        });  
        builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();  
            }  
        });  
        builder.create().show();   

原生Dialog實現方式樣式三L多選對話方塊:

這裡寫圖片描述

   final String items[]={"喬巴","山治","烏索普"};  
   final boolean selected[]={true,false,true};  
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器  
        builder.setTitle("提示"); //設定標題  
        builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可  
        builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {  
               // dialog.dismiss();  
              //which是點選的item下標,在這裡可以保留下標的狀態用於下次呈現
              // android會自動根據你選擇的改變selected陣列的值。  
            }  
        });  
        builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();   
            }  
        });  
        builder.create().show();  

自定義Dialog實現方式

程式碼塊

 public class CouponDialog extends Dialog {

    private Context context;

    @SuppressLint("InflateParams")
    public CouponDialog (final Context context){
        super(context, R.style.DialogStyle);
        this.context=context;
        View view = LayoutInflater.from(context).inflate(R.layout.layout_cash_coupon_dialog, null);//設定相關佈局
        setContentView(view);
        // 設定視窗大小
        Window mWindow = getWindow();
        WindowManager.LayoutParams lp = mWindow.getAttributes();
        if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {// 豎屏
        //這裡必須設定相關的高度和寬度,如果不設定將不會顯示出來
            lp.width = getScreenWidth(context);
            lp.height = getScreenHeight(context)/2;
        } else {
            lp.width = getScreenHeight(context);
        }
        mWindow.setAttributes(lp);
        // 設定可以動畫
        mWindow.setWindowAnimations(R.style.dialogAnimBottomAndFade);
        // 位置設定在底部--顯示位置(Gravity.CENTER)中間
        mWindow.setGravity(Gravity.BOTTOM);
        // 設定可取消
       setCancelable(true);
        setCanceledOnTouchOutside(true);

    }

public static int getScreenWidth(Context context){
        DisplayMetrics dm = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }
    public static int getScreenHeight(Context context){
        DisplayMetrics dm = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.heightPixels;
    }

//如果想做相關點選事件在初始化中進行物件以及資料的初始化
}

styles裡的自定義Dialog配置

<!--自定義dialog-->
    <style name="DialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <!--  邊框-->
        <item name="android:windowIsFloating">true</item>
        <!--是否浮現在activity之上-->
        <item name="android:windowIsTranslucent">false</item>
        <!--半透明-->
        <item name="android:windowNoTitle">true</item>
        <!--無標題-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>


<!--自定義dialog的動畫效果-->
    <style name="dialogAnim" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/dialog_show</item>
        <item name="android:windowExitAnimation">@anim/dialog_dismiss</item>
    </style>

anim中建立dialog_show和dialog_dismiss

dialog_show

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="100%p"
        android:duration="500" />
</set> 

dialog_dismiss

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:toYDelta="100%p"
        android:duration="500" />
</set> 

經過資料配置之後可以顯示比較複雜的效果圖
這裡寫圖片描述

這裡寫圖片描述

結束語

對於原生Dialog的樣式無法進行重繪,並且根據Android Studio中使用的API不同,很可能會發生樣式的變化。結合多方面因素考慮還是需要自定義一個Dialog介面用於複寫比較好,不但可以保持頁面的整潔性,還可以保證頁面的統一性。