Android弹出框PopupWindow,Dialog,AlertDialog.Builder,AlertDialog的一知半解

项目自定义布局弹出框需要自适配屏幕的大小,坑了我自己一阵子,发现自己对弹出框的理解跟使用概念混淆,所以花了一点时间查询并总结了一下

首先是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();

得到的效果如下


params.width与params.height的设置大小也是以分辨率sp为单位的数值,在不同的手机分辨率面前也会有不同的效果

最终使用了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。

猜你喜欢

转载自blog.csdn.net/weixin_30267253/article/details/64905847