Как различные эффекты Gravity влияют на PopupWindow.showAtLocation() в Android?
Я не могу найти хорошие документы в PopupWindows showAtLocation и Gravity.
Как различные эффекты Gravity влияют на PopupWindow.showAtLocation() в Android?
Я не могу найти хорошие документы в PopupWindows showAtLocation и Gravity.
После взлома в течение нескольких часов, пробовав некоторые черные магические математики, чтобы вычислить центры и попытаться выровнять представление с помощью Gravity.TOP, я нашел сообщение, которое использовало Gravity.CENTER. Я собираю свои результаты здесь, надеясь, что он спасет кого-то еще от боли.
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);
Вид необходим только для токена окна, он не оказывает другого влияния на местоположение.
Gravity сообщает менеджеру компоновки, где следует начинать систему координат и как обрабатывать эти координаты. Я не могу найти документы, но хакинг показывает мне, что:



Вы можете изменить гравитацию PopupWindow, Gravity.CENTER в методе showAtLocation:
popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);
Изображения ниже показывают эффекты:
Gravity.CENTER 
Gravity.TOPGravity.BOTTOMGravity.LEFTGravity.RIGHTGravity.TOP | Gravity.LEFTGravity.TOP | Gravity.RIGHTGravity.BOTTOM | Gravity.LEFTGravity.BOTTOM | Gravity.RIGHT Вы можете дополнительно расположить его, изменив (x,y) смещения в
popupWindow.showAtLocation(anyView, gravity, x, y);
Например
popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);

Вот код для примеров выше. См. Как создать простое всплывающее окно Android для получения более подробной справки.
int gravity = Gravity.CENTER;
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
popupView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
popupWindow.dismiss();
return true;
}
});
popupWindow.showAtLocation(anyView, gravity, 0, 0);
showAsDropDown если вы хотите привязать всплывающее окно к представлению.