Показать PopupWindow централизованно - PullRequest
41 голосов
/ 19 мая 2011

У меня есть несколько всплывающих окон в моем приложении, оно полноэкранное и следующий код:

    content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int screenWidth = windowManager.getDefaultDisplay().getWidth();
    int screenHeight = windowManager.getDefaultDisplay().getHeight();
    int x = screenWidth / 2 - content.getMeasuredWidth() / 2;
    int y = screenHeight / 2 - content.getMeasuredHeight() / 2;
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y);

Сделать окно показанным по центру.

Но у меня есть другое действие, которое не является полноэкранным, когдавсплывающее окно открывается справа вниз от того места, где оно должно быть.

Пытаясь выяснить, почему это происходит, я думаю, что showAtLocation показывает, что это относительно текущей активности, но мне нужно показать ее относительно отображения.

Как я могу это сделать?Или есть более простой способ, чтобы всплывающее окно было только по центру?

Ответы [ 2 ]

106 голосов
/ 16 сентября 2011
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);

Это выровняет ваш взгляд.

Мне потребовалось 2 часа боли, чтобы понять это.Мне не нужно было никакой математики черной магии, чтобы справиться с этим.

Представление необходимо только для маркера окна, оно не оказывает никакого другого влияния на местоположение.

Гравитация сообщает менеджеру расположения, гдезапустить систему координат и как обрабатывать эти координаты.Я не могу найти документы, но взлом показывает, что:

  • CENTER использует середину всплывающего окна для выравнивания по указанному x, y.Таким образом, 0,0 центрируется по экрану
  • Внизу используется нижняя часть всплывающего окна для выравнивания по указанному x, y.Таким образом, 0,0 имеет всплывающее нижнее окно, выровненное по нижнему краю экрана.Если вы хотите заполнить 10px, то y = 10 (не -10), чтобы переместить всплывающее окно на 10 пикселей вверх.

Я написал это здесь Android PopupWindow.showAtLocation () и эффектытяжести

10 голосов
/ 05 декабря 2014
        View popupView = layoutInflater.inflate(R.layout.index_popviewxml,
                null);


        final PopupWindow popupWindow = new PopupWindow(popupView,
                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true);



        popupWindow.setTouchable(true);
        popupWindow.setFocusable(true);

        popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...