自己封装了一个简单的Dialog,基本上所有功能也都能实现了。传上来供大家参考学习,有更好的点子,希望大家提出。
我们系统自带的AlertDialog的样式非常的难看。有时候我们要实现其他样式的时候,需要set一个view然后再做操作。但是改背景,和圆角等都不方便。
我是通过继承AlertDialog中的内部类Builder实现的。封装以后,使用非常方便。有5个public方法供使用即可达到要求:
1、setView();传入自定义的view;
2、setWidthRadio();设置宽度的比例(值0-1),默认是0.8屏幕的宽;
3、showDialog();显示出来;
4、getViewById();获取里面的控件,做点击事件等;
5、dismiss();dialog的消失;
先看图片:
实现上述样式需要以下几步:
一、自定义一个dialog的样式。主要作用是去掉背景色,去掉边框等,直接复制到Styles文件中就可以了。
<style name="dialog" parent="@android:style/Theme.Dialog">
<!--设置背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--设置去边框-->
<item name="android:windowFrame">@null</item>
<!--设置是否浮动于activity之上-->
<item name="android:windowIsFloating">true</item>
<!--设置背景activity是否模糊,默认是true-->
<item name="android:backgroundDimEnabled">true</item>
<!--设置模糊的程度0为不模糊,1为全黑-->
<item name="android:backgroundDimAmount">0.5</item>
</style>
二、继承AlertDialog.Builder.废话不多说,上代码:
package com.yhq.customdialog;
import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class CustomDialog extends AlertDialog.Builder {
private Context mContext;
private int mDialogWidth;
private View mView;
private AlertDialog mDialog;
public CustomDialog(Context context, int themeResId) {
super(context, themeResId);
init(context);
}
private void init(Context context) {
mContext = context;
mDialogWidth = (int) (0.8 * getScreenWidth());//默认0.8屏幕宽
}
/**
* 设置自定义的view
*
* @param layoutResId
* @return
*/
public CustomDialog setView(int layoutResId) {
mView = LayoutInflater.from(mContext).inflate(layoutResId, null);
return (CustomDialog) super.setView(mView);
}
/**
* 设置dialog的宽度
*
* @param radio 指的是屏幕宽度的几倍,取值范围一般为0-1之间
*/
public CustomDialog setWidthRadio(float radio) {
mDialogWidth = (int) (radio * getScreenWidth());
return this;
}
/**
* show对话框
*/
public void showDialog() {
mDialog = create();
mDialog.show();
Window window = mDialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.width = mDialogWidth;
window.setAttributes(params);
}
public View getViewById(int id) {
View view = mView.findViewById(id);
return view;
}
public void dismiss() {
mDialog.dismiss();
}
//获取屏幕宽度
private int getScreenWidth() {
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
return wm.getDefaultDisplay().getWidth();
}
}
三、MainActivity中代码
package com.yhq.customdialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
final CustomDialog dialog = new CustomDialog(this, R.style.dialog);//这边自定义样式必须要有
dialog.setView(R.layout.dialog_view);//设置自定义的view
dialog.setWidthRadio(0.6f);//设置宽度的比例,与屏幕宽度比,默认0.8
dialog.showDialog();//显示dialog
TextView tv2 = (TextView) dialog.getViewById(R.id.tv2);//根据资源id获取里面控件
TextView tv3 = (TextView) dialog.getViewById(R.id.tv3);//根据资源id获取里面控件
tv2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//dosomething
dialog.dismiss();//控制dialog消失
}
});
tv3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//dosomething
dialog.dismiss();//控制dialog消失
}
});
}
}
到此为止整个自定义的Dialog就完成了。是不很简单?