看过一位前辈说过一番话,工作五六年,东西做的多,但总结的却很少,哪怕自己会的东西,很简单的东西,时间长了也会遗忘的,所以我们要学会有自己的代码库,将耦合度低的代码封装起来,放在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);