PopupWindow怎么设置弹出的页面位置

这是一个商品详细页面我想点击“参数”弹出来一个页面展示商品的全部参数,但是现在我写的这个PopupWindow的显示位置有些问题我点击“参数”就会在参数下面弹出一个页面或“参数”上面弹出一个页面。我想在最下面弹出来一个页面就是想把弹出页面的位置设置成最下面弹出来的效果在购物车下面弹出来。

img


这个是我想要的效果

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/197410
  • 这篇博客你也可以参考下:底部虚拟按键挡住PopupWindow显示
  • 除此之外, 这篇博客: Popup Window的创建及其基本属性中的 2:创建私有方法来编写Popup Window逻辑代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    private void showPopupWindow(){
            View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
            PopupWindow popupWindow = new PopupWindow(contentView,
                    WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT,true);
    
            ImageView imageViewOne = (ImageView)contentView.findViewById(R.id.image_1);
            ImageView imageViewTwo = (ImageView)contentView.findViewById(R.id.image_2);
            ImageView imageViewThree = (ImageView)contentView.findViewById(R.id.image_3);
            ImageView imageViewFour = (ImageView)contentView.findViewById(R.id.image_4);
            ImageView imageViewFive = (ImageView)contentView.findViewById(R.id.image_5);
            ImageView imageViewSix = (ImageView)contentView.findViewById(R.id.image_6);
            ImageView imageViewSeven = (ImageView)contentView.findViewById(R.id.image_7);
            ImageView imageViewEight = (ImageView)contentView.findViewById(R.id.image_8);
    
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null);
    
            popupWindow.showAtLocation(view, Gravity.BOTTOM,0,getLayoutHeight());
    
        }
    

    说明:第一步先创建view对象来绑定xml布局,接着创建PopupWindow实例。对于接下来的控件的加载注册与碎片很相似,都是依附于开头提到的view对象。
    最后两行代码是将要展示的Popup Window设定展示的位置。如若想让展示的控件点击有效果,只需设置监听即可:

    private void showPopupWindow(){
            View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
            popupWindow = new PopupWindow(contentView,
                    WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT,true);
    
            ImageView imageViewOne = (ImageView)contentView.findViewById(R.id.image_1);
            ImageView imageViewTwo = (ImageView)contentView.findViewById(R.id.image_2);
            ImageView imageViewThree = (ImageView)contentView.findViewById(R.id.image_3);
            ImageView imageViewFour = (ImageView)contentView.findViewById(R.id.image_4);
            ImageView imageViewFive = (ImageView)contentView.findViewById(R.id.image_5);
            ImageView imageViewSix = (ImageView)contentView.findViewById(R.id.image_6);
            ImageView imageViewSeven = (ImageView)contentView.findViewById(R.id.image_7);
            ImageView imageViewEight = (ImageView)contentView.findViewById(R.id.image_8);
    
            imageViewOne.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewTwo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewThree.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewFour.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewFive.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                    showSecondPopupWindow();
                    popupWindow.dismiss();
                }
            });
    
            imageViewSix.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewSeven.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
    
            imageViewEight.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
                }
            });
            
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null);
            popupWindow.showAtLocation(view, Gravity.BOTTOM,0,getLayoutHeight());
        }
    
  • 以下回答来自chatgpt:

    回答:

    为了让ChatGPT能够更好地理解您的问题,我稍微修改了一下问题标题和问题内容:

    问题标题:如何设置PopupWindow弹出页面的位置到指定控件的下方?

    问题内容:我正在开发一个商品详细页面,当用户点击“参数”时,我想弹出一个页面,展示商品的全部参数。但是,我写的PopupWindow的显示位置有些问题——它有时会在参数下面弹出一个页面,有时候会在参数上面弹出一个页面。我希望它在购物车下方弹出。请问应该如何实现这个最终的显示效果呢?

    具体解决方案如下:

    1. 创建一个PopupWindow对象,并设置好它的大小和内容。
    PopupWindow popupWindow = new PopupWindow(context);
    popupWindow.setWidth(width);
    popupWindow.setHeight(height);
    popupWindow.setContentView(contentView);
    

    这里的width和height是PopupWindow的宽度和高度,contentView是PopupWindow里面要展示的内容。

    1. 获取购物车控件的位置信息。

    比如你可以用以下代码获取购物车控件在屏幕上的位置:

    int[] cartLocation = new int[2];
    cartView.getLocationOnScreen(cartLocation);
    int cartX = cartLocation[0];
    int cartY = cartLocation[1];
    

    这里的cartView是购物车的控件对象。

    1. 计算出PopupWindow应该出现的位置。

    你可以根据购物车控件的位置和PopupWindow的大小,计算出最终的位置。比如你可以用以下代码计算PopupWindow的位置:

    int popupX = cartX + cartView.getWidth() / 2 - popupWindow.getWidth() / 2;
    int popupY = cartY + cartView.getHeight();
    

    这里的popupX和popupY就是PopupWindow应该出现的位置。

    1. 设置PopupWindow的位置并显示出来。

    最后,你可以用以下代码设置PopupWindow的位置并显示出来:

    popupWindow.showAtLocation(parentView, Gravity.NO_GRAVITY, popupX, popupY);
    

    这里的parentView是PopupWindow的父控件对象,Gravity.NO_GRAVITY表示PopupWindow不依赖于任何Gravity设置,通过popupX和popupY来指定位置。

    完整的代码如下:

    PopupWindow popupWindow = new PopupWindow(context);
    popupWindow.setWidth(width);
    popupWindow.setHeight(height);
    popupWindow.setContentView(contentView);
    
    int[] cartLocation = new int[2];
    cartView.getLocationOnScreen(cartLocation);
    int cartX = cartLocation[0];
    int cartY = cartLocation[1];
    
    int popupX = cartX + cartView.getWidth() / 2 - popupWindow.getWidth() / 2;
    int popupY = cartY + cartView.getHeight();
    
    popupWindow.showAtLocation(parentView, Gravity.NO_GRAVITY, popupX, popupY);
    

    希望这个解答能够帮助到您!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^