Android自定义Dialog

看过一位前辈说过一番话,工作五六年,东西做的多,但总结的却很少,哪怕自己会的东西,很简单的东西,时间长了也会遗忘的,所以我们要学会有自己的代码库,将耦合度低的代码封装起来,放在github上或者博客上,然后我会想这些东西才会是自己的,哪怕以后项目重新遇到了这些代码,可以马上拿来就用。今天有空,就想想平常用的dialog,用着是挺简单的,但总感觉像少了点什么,每次都会翻开以前的代码,然后又重写一遍,感觉不值,所以就总结了下,dialog使用需要的知识。


一、效果图  源码戳这里


功能挺简单的,总结之后真的可以收获遗忘的知识,如何设置dialog显示和消失动画?背景阴影如何去掉?是否禁止点击dialog其他地方或者点击返回键让其消失?这些都是会在需求中用到的。


二、代码分析

 1.创建,初始化

public void onCreateView() {
        view = layoutInflater.inflate(R.layout.view_dialog_cutomer, null);
        tv_content = (TextView) view.findViewById(R.id.tv_content);
        btn_ok= (Button) view.findViewById(R.id.btn_ok);
        btn_cancel= (Button) view.findViewById(R.id.btn_cancel);
        btn_ok.setOnClickListener(this);
        btn_cancel.setOnClickListener(this);
        mDialog = new Dialog(mContext, R.style.Customer_Dialog);// 创建自定义样式
        WindowManager.LayoutParams params = mDialog.getWindow()
                .getAttributes();
        params.gravity = Gravity.CENTER;
        // alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明,自身不可见。
        params.alpha = 1.0f;
        // 这个是设置activity的亮度的dimAmount在0.0f和1.0f之间,0.0f完全不暗,即背景是可见的
        params.dimAmount = 1.0f;
        // 设置对话框的布局参数为居中
        mDialog.getWindow().setAttributes(params);
        //设置进场和出场动画
        mDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim);
        //设置dialog点击其他地方是否消失
        mDialog.setCanceledOnTouchOutside(false);
        //将布局文件添加进dialog
        mDialog.setContentView(view);
    }

2.使用的dialog样式


    <style name="Customer_Dialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item><!--必须透明,不然会有黑色阴影-->
        <item name="android:backgroundDimEnabled">true</item><!--false去掉背景色-->
        <item name="android:windowContentOverlay">@null</item>
    </style>
<style name="Dialog_Anim" parent="android:Animation" >  
        <item name="@android:windowEnterAnimation">@animator/left_in</item>  //进入时的动画  
        <item name="@android:windowExitAnimation">@animator/right_out</item>    //退出时的动画  
 </style>
left_in和right_out分别是从左进,右出的动画资源文件,没贴出,可以开源码。定义好动画的样式之后,按照下面代码使用

//设置进场和出场动画  
        mDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim);

4.禁止返回键,让dialog设置OnKeyListener监听,以下写成公共方法,外面自由设置

 public void setEnjoinBack(final boolean enjoin){  
        mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {  
            @Override  
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {  
                if(keyCode==KeyEvent.KEYCODE_BACK){  
                    return enjoin;  
                }else{  
                    return false;  
                }  
            }  
        });  
    }

三、全部代码

package com.yus.customerdialog;  
  
import android.app.Dialog;  
import android.content.Context;  
import android.content.DialogInterface;  
import android.view.Gravity;  
import android.view.KeyEvent;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.WindowManager;  
import android.widget.Button;  
import android.widget.TextView;  
  
/** 
 * Created by yufs on 2017/8/8. 
 */  
  
public class CustomerDialog implements View.OnClickListener {  
    private Context mContext;  
    private View view;  
    private LayoutInflater layoutInflater;  
    private Dialog mDialog;  
    private Button btn_ok,btn_cancel;  
  
    private TextView tv_content;  
  
    public CustomerDialog(Context context) {  
        this.mContext = context;  
        this.layoutInflater = LayoutInflater.from(context);  
        onCreateView();  
    }  
  
    public void onCreateView() {  
        view = layoutInflater.inflate(R.layout.view_dialog_cutomer, null);  
        tv_content = (TextView) view.findViewById(R.id.tv_content);  
        btn_ok= (Button) view.findViewById(R.id.btn_ok);  
        btn_cancel= (Button) view.findViewById(R.id.btn_cancel);  
        btn_ok.setOnClickListener(this);  
        btn_cancel.setOnClickListener(this);  
        mDialog = new Dialog(mContext, R.style.Customer_Dialog);// 创建自定义样式  
        WindowManager.LayoutParams params = mDialog.getWindow()  
                .getAttributes();  
        params.gravity = Gravity.CENTER;  
        // alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明,自身不可见。  
        params.alpha = 1.0f;  
        // 这个是设置activity的亮度的dimAmount在0.0f和1.0f之间,0.0f完全不暗,即背景是可见的  
        params.dimAmount = 1.0f;  
        // 设置对话框的布局参数为居中  
        mDialog.getWindow().setAttributes(params);  
        //设置进场和出场动画  
        mDialog.getWindow().setWindowAnimations(R.style.Dialog_Anim);  
        //设置dialog点击其他地方是否消失  
        mDialog.setCanceledOnTouchOutside(false);  
        //将布局文件添加进dialog  
        mDialog.setContentView(view);  
    }  
  
    /** 
     * 是否禁止返回键 
     * @param enjoin 
     */  
    public void setEnjoinBack(final boolean enjoin){  
        mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {  
            @Override  
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {  
                if(keyCode==KeyEvent.KEYCODE_BACK){  
                    return enjoin;  
                }else{  
                    return false;  
                }  
            }  
        });  
    }  
  
    public CustomerDialog setCancelMessage(String msg){  
        btn_cancel.setText(msg);  
        return this;  
    }  
  
    public CustomerDialog setOkMessage(String msg){  
        btn_ok.setText(msg);  
        return this;  
    }  
  
    public CustomerDialog setContent(String msg) {  
        tv_content.setText(msg);  
        return this;  
    }  
  
    public void showDialog() {  
        if(mDialog!=null&&!isShowing())  
            mDialog.show();  
    }  
  
    public void hideDialog() {  
        mDialog.dismiss();  
    }  
  
    public boolean isShowing(){  
        return mDialog.isShowing();  
    }  
  
  
    @Override  
    public void onClick(View v) {  
        switch (v.getId()){  
            case R.id.btn_ok:  
                if(onDialogClickListener!=null)  
                    onDialogClickListener.onClickOk();  
                hideDialog();  
                break;  
            case R.id.btn_cancel:  
                if(onDialogClickListener!=null)  
                    onDialogClickListener.onClickCancel();  
                hideDialog();  
                break;  
        }  
    }  
    /** 
     * 自定事件监听 
     */  
    public interface OnDialogClickListener{  
        void onClickOk();  
        void onClickCancel();  
    }  
    OnDialogClickListener onDialogClickListener;  
  
    public CustomerDialog setOnDialogClickListener(OnDialogClickListener onDialogClickListener) {  
        this.onDialogClickListener = onDialogClickListener;  
        return this;  
    }  
}  

布局文件:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:gravity="center"  
    android:layout_height="match_parent">  
  
    <RelativeLayout  
        android:layout_width="320dp"  
        android:paddingLeft="10dp"  
        android:paddingRight="10dp"  
        android:paddingTop="15dp"  
        android:paddingBottom="12dp"  
        android:background="@drawable/bg_dialog_shape"  
        android:layout_height="190dp">  
  
       <TextView  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:textSize="16sp"  
           android:layout_centerHorizontal="true"  
           android:textColor="#333333"  
           android:text="提示"  
           />  
  
        <TextView  
            android:id="@+id/tv_content"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:layout_centerInParent="true"  
            android:textSize="15sp"  
            android:textColor="#333333"  
            android:text="是否禁止返回键、点击外部是否消失、进场和出场动画、设置背影"  
            />  
  
        <LinearLayout  
            android:layout_width="match_parent"  
            android:orientation="horizontal"  
            android:layout_alignParentBottom="true"  
            android:layout_height="wrap_content">  
  
            <Button  
                android:id="@+id/btn_cancel"  
                android:layout_width="0dp"  
                android:layout_weight="1"  
                android:text="取消"  
                android:layout_height="wrap_content" />  
            <Button  
                android:id="@+id/btn_ok"  
                android:layout_width="0dp"  
                android:layout_weight="1"  
                android:text="确定"  
                android:layout_height="wrap_content" />  
        </LinearLayout>  
  
    </RelativeLayout>  
</LinearLayout>  

这样使用:

CustomerDialog dialog=new CustomerDialog(MainActivity.this);  
        dialog.setOnDialogClickListener(new CustomerDialog.OnDialogClickListener() {  
            @Override  
            public void onClickOk() {  
                Toast.makeText(MainActivity.this,"ok",Toast.LENGTH_LONG).show();  
            }  
  
            @Override  
            public void onClickCancel() {  
                Toast.makeText(MainActivity.this,"cancel",Toast.LENGTH_LONG).show();  
            }  
        }).showDialog();  
        //禁止返回键  
        dialog.setEnjoinBack(true);


 

                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值