Показать всплывающее окно централизованного
У меня есть всплывающие окна в моем приложении, это полноэкранный и следующий код:
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 показывает его относительно текущей Activity, но мне нужно показать его относительно отображения.
Как я могу это сделать? Или есть более простой способ просто всплывающего окна только по центру?
Ответы
Ответ 1
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);
Это центрирует ваше представление.
Мне потребовалось 2 часа боли, чтобы понять это. Мне не нужны математики черной магии, чтобы справиться с этим.
Вид необходим только для токена окна, он не оказывает другого влияния на местоположение.
Gravity сообщает менеджеру компоновки, где следует начинать систему координат и как обрабатывать эти координаты. Я не могу найти документы, но хакинг показывает мне, что:
- CENTER использует середину всплывающего окна для выравнивания по указанному x, y. Таким образом, 0,0 имеет ориентацию экрана
- BOTTOM использует нижнюю часть всплывающего окна для выравнивания с указанными x, y. Таким образом, 0,0 имеет выпадающее меню, выровненное со дном экрана. Если вы хотите заполнить 10px, тогда y = 10 (не -10), чтобы переместить всплывающее окно на 10 пикселей.
Я написал это здесь Android PopupWindow.showAtLocation() и эффекты Gravity
Ответ 2
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);