项目自定义布局弹出框需要自适配屏幕的大小,坑了我自己一阵子,发现自己对弹出框的理解跟使用概念混淆,所以花了一点时间查询并总结了一下
首先是AlertDialog.Builder与AlertDialog的区别,可以参照网址:http://www.360doc.com/content/13/1225/10/5600807_339933436.shtml
大概的意思就是说,因为AlertDialog的源码都是写保护的,不能直接获取到AlertDialog的实例去操作,只能通过AlertDialog.Builder去获取AlertDialog的实例去操作。所以AlertDialog.Builder与AlertDialog其实是同样的,好,排除解决一个了。
上述的弹出框的区别就变成了PopupWindow,Dialog,AlertDialog.Builder的区别了。
网络上查询了PopupWindow与AlertDialog.Builder的区别,网络上有人说PopupWindow是阻塞弹出框,而AlertDialog.Builder不是阻塞弹出框。我一开始理解的是阻塞弹出框难道是不dismiss的话是不是后面的代码不会执行?抱着这个疑问,我编写了一个例子运行。
private PopupWindow mPopupWindow; private Button btn_onclick; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intiView(); } private void intiView() { btn_onclick = (Button)findViewById(R.id.btn_onclick); btn_onclick.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { popwindow(); Timer time = new Timer(); time.schedule(timefortask, 100, 100); // 1s后执行task,经过1s再次执行 } }); } TimerTask timefortask = new TimerTask() { @Override public void run() { Log.e("timefortask","1213245"); } }; private void popwindow() { View popupView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_test, null); mPopupWindow = new PopupWindow(popupView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, true); mPopupWindow.showAtLocation(popupView, Gravity.RIGHT| Gravity.BOTTOM, 0, 0); popupView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mPopupWindow.dismiss(); } }); }好,运行一下结果
点击之后就一直打印了,阻塞什么了啊?后来又去上网找了一下资料,看到了网址:http://blog.csdn.net/zhengxiaoyao0716/article/details/48768407
大致的意思就是说安卓没有什么阻塞UI线程运行的弹出框,PopupWindow只是屏蔽了对其他ui的操作。
然后又查阅了一些资料发现网络上并没有很详细的区分PopupWindow,Dialog,AlertDialog.Builder。那是不是他们完全一样呢?在编写自定义弹出框自适配屏幕固定比例大小的过程中,我还是发现了一点不同。无论是使用PopupWindow还是AlertDialog.Builder都无法得到固定屏幕大小百分比的效果
final AlertDialog.Builder builder = new AlertDialog.Builder(context); View contenView = LayoutInflater.from(context).inflate(R.layout.scanphoto_popu_layout, null); builder.setView(contenView); final AlertDialog dialog = builder.create();
Window dialogWindow = dialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.CENTER); // WindowManager m = getWindowManager(); Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值 p.height = (int) (d.getHeight() * 0.8); // 高度设置为屏幕的0.6 p.width = (int) (d.getWidth() * 0.8); // 宽度设置为屏幕的0.65 dialog.getWindow().setAttributes(p);//设置大小
dialog.show();
得到的效果如下
最终使用了Dialog的弹出框后解决了自定义布局百分比大小显示固定的问题
final Dialog dialog = new Dialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.scanphoto_popu_layout); // // /* // * 获取圣诞框的窗口对象及参数对象以修改对话框的布局设置, // * 可以直接调用getWindow(),表示获得这个Activity的Window // * 对象,这样这可以以同样的方式改变这个Activity的属性. // */ Window dialogWindow = dialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.CENTER); /* * 将对话框的大小按屏幕大小的百分比设置 */ WindowManager m = getWindowManager(); Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值 p.height = (int) (d.getHeight() * 0.8); // 高度设置为屏幕的0.6 p.width = (int) (d.getWidth() * 0.8); // 宽度设置为屏幕的0.65 dialogWindow.setAttributes(p); dialog.show();
对于我个人来说为了方便使用,以后开发中会统一使用Dialog。