在android开发中,对话框的使用已非常频繁,需求复杂度的提升导致dialog自带的一些样式难以满足现在的一些需求。这时候往往希望通过自定布局样式来实现特定的效果,dialog本身也支持自定义布局样式,那么如何去实现呢?
主要分为以下几个步骤:
1.创建一个Dialog对象;
2.自定义布局将填充布局到Dialog中;
3.设置宽高,防止显示不全;
下面来一步一步简单实现一下,还是先看下效果图吧:
代码如下,直接看:
public class MainActivity extends AppCompatActivity {
private Dialog mDialog;
private Button bt_confirm;
private Button bt_cancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showDialog(View view){
//1.创建一个Dialog对象,如果是AlertDialog对象的话,弹出的自定义布局四周会有一些阴影,效果不好
mDialog = new Dialog(this);
//去除标题栏
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
//2.填充布局
LayoutInflater inflater = LayoutInflater.from(this);
View dialogView = inflater.inflate(R.layout.view_dialog, null);
//将自定义布局设置进去
mDialog.setContentView(dialogView);
//3.设置指定的宽高,如果不设置的话,弹出的对话框可能不会显示全整个布局,当然在布局中写死宽高也可以
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
Window window = mDialog.getWindow();
lp.copyFrom(window.getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//注意要在Dialog show之后,再将宽高属性设置进去,才有效果
mDialog.show();
window.setAttributes(lp);
//设置点击其它地方不让消失弹窗
mDialog.setCancelable(false);
initDialogView(dialogView);
initDialogListener();
}
private void initDialogView(View view) {
bt_confirm = (Button) view.findViewById(R.id.bt_confirm);
bt_cancel = (Button) view.findViewById(R.id.bt_cancel);
}
private void initDialogListener() {
bt_confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
}
});
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
}
});
}
}
布局文件就不贴出来了,总体来说,实现起来还是比较简单,但可能在实现过程中会遇到几个问题:
1. 弹出的对话框样式只显示出一部分;------宽高设置的问题
2.弹出对话框四周还有一些阴影,效果不好;-----创建Dialog对象,则不会有
3.弹出对话框顶部有一段空白,但自定义布局中没有设置啊?------将Dialog的标题栏去掉,注意要在setContentView()方法之前
具体实现可看代码,都有注释。。。。当然还可以通过activity,设置其主题为dialog的样式来实现,这个就看个人喜好了。。。。。。。