天天看點

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軸的距離,才能隐藏掉。