天天看点

PopupWindow 的使用及注意事项

在项目里面很多时候都会有弹窗显示列表数据这样的需求,很多人都用Spanner,其实效果不佳,更多的是自定义布局显示,通常使用PopupWindow代替,直接上代码:

final View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_search_car_popu, null);

        mPopupWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, true);
        mPopupWindow.setTouchable(true);
        mPopupWindow.setFocusable(true);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
           

这样就创建完成了,独立出一个方法来显示:

//显示popup
    private void showPoupwindow() {
        if (mPopupWindow.isShowing()) {
         
            mPopupWindow.dismiss();


        } else {


           // 以下拉列表方式显示
           mPopupWindow.showAsDropDown(llSearch, 0, 0);


        }
    }
           

PopupWindow显示的方式有两种,根据需求而定,显示指定位置showAtLocation(),以下拉列表方式显示showAsDropDown.

注意:

       mPopupWindow.setTouchable(true);

        mPopupWindow.setFocusable(true);

        mPopupWindow.setOutsideTouchable(true);

这三个方法不能缺。

如果你的PopupWindow需要paddingBottom多少dp,这时候点击距离底部的空白处PopupWindow不能隐藏掉,接下来你需要这样做,

view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int height = view.findViewById(R.id.view).getBottom();
                int y = (int) event.getY();
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    if (y < height) {
                        mPopupWindow.dismiss();
                    }
                }
                return true;
            }
        });
           

需要拿到距离底部的位置和点击的paddingBottom空白处,判断Y轴的距离,才能隐藏掉。