天天看點

自定義的Dialog

原文位址:http://www.jianshu.com/p/e588d74b5c9f

這是一個自定義的dialog,可以從螢幕底部彈出

第一步、自定義樣式

<!--自定義布局的dialog-->
    <style name="MyDialog" parent="android:style/Theme.Dialog">
        <!-- 背景顔色及透明程度 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否有标題 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 是否浮現在activity之上,會造成macth_parent失效-->
        <item name="android:windowIsFloating">false</item>
        <!-- 是否模糊 -->
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowFrame">@null</item>
    </style>
           

第二步、dialog的代碼實作,模拟選擇圖檔和拍照2個功能的實作

/**
 * 選擇圖檔對話框
 */
public class SelectPicDialog extends Dialog {
    public SelectPicDialog(Context context, int themeResId) {
        super(context, themeResId);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_select_pic);
        ButterKnife.bind(this);

    }

    @OnClick({R.id.linearlayout_out,R.id.textview_take_photo, R.id.textview_select_photo, R.id.textview_cancal})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.textview_take_photo:
                if(listener!=null){
                    listener.onClickTakePhoto();
                }
                this.cancel();
                break;
            case R.id.textview_select_photo:
                if(listener!=null){
                    listener.onClickSelectPic();
                }
                this.cancel();
                break;
            case R.id.linearlayout_out:
            case R.id.textview_cancal:
                this.cancel();
                break;
        }
    }

    private OnWindowItemClickListener listener;

    public void setOnWindowItemClickListener(OnWindowItemClickListener listener) {
        this.listener = listener;
    }

    public interface OnWindowItemClickListener {
        void onClickTakePhoto();
        void onClickSelectPic();
    }
}
           

第三步、具體的調用

<span style="white-space:pre">	</span>SelectPicDialog dialog = new SelectPicDialog(mContext,R.style.MyDialog);
        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM);  //此處可以設定dialog顯示的位置
        window.setWindowAnimations(R.style.mypopwindow_anim_style);  //添加動畫
        dialog.show();
        dialog.setOnWindowItemClickListener(new SelectPicDialog.OnWindowItemClickListener(){

            @Override
            public void onClickTakePhoto() {
                startActivityForResult(createCameraIntent(), CREATE_CAMERA);   //選擇拍照
            }

            @Override
            public void onClickSelectPic() {
                startActivityForResult(createPickIntent(), CREATE_PICK);   //選擇啟用系統的選擇圖檔
            }
        });
           

總結:

1、如果不設定,Dialog預設是Gravity.CENTER。dialog 和popupWindow都有預設的背景,可以通過setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。

2、AlertDialog是非阻塞式對話框:AlertDialog彈出時,背景還可以做事情;而PopupWindow是阻塞式對話框:PopupWindow彈出時,程式會等待,在PopupWindow退出前,程式一直等待,隻有當我們調用了dismiss方法的後,PopupWindow退出,程式才會向下執行。

3、第3方的庫 bottomsheet:https://github.com/Flipboard/bottomsheet                                                        http://www.lxway.com/4054259856.htm

繼續閱讀