Получить размер представления контента в onCreate
Я ищу хороший способ измерения размеров области содержимого для активности на Android.
Получение отображения всегда работает. Просто сделайте следующее:
Display display = getWindowManager().getDefaultDisplay();
И вы можете получить количество пикселей для всего экрана. Конечно, это не учитывает ActionBar, строку состояния или любые другие виды, которые уменьшают доступный размер самой активности.
Как только действие запущено, вы можете сделать это:
View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
Только для получения содержимого. Но выполнение этого в onCreate() приведет к представлению с шириной и высотой 0, 0.
Есть ли способ получить эти измерения во время onCreate? Я полагаю, что должен быть способ получить измерения любых баров состояния и просто вычесть из общего размера экрана, но я не могу найти способ сделать это. Я думаю, что это был бы единственный способ, потому что метод окна содержимого всегда будет возвращать представление без ширины/высоты до его рисования.
Спасибо!
Ответы
Ответ 1
Для этого вы можете использовать макет или предварительный приемник, в зависимости от ваших целей. Например, в onCreate():
final View content = findViewById(android.R.id.content);
content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//Remove it here unless you want to get this callback for EVERY
//layout pass, which can get you into infinite loops if you ever
//modify the layout from within this method.
content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
//Now you can get the width and height from content
}
});
Ответ 2
(скопирован из мой ответ на связанный вопрос)
Я использую следующий метод: отправьте runnable из onCreate()
, который будет выполнен при создании представления:
contentView = findViewById(android.R.id.content);
contentView.post(new Runnable()
{
public void run()
{
contentHeight = contentView.getHeight();
}
});
Этот код будет работать в основном потоке пользовательского интерфейса, после завершения onCreate()
.
Ответ 3
Это, кажется, повторяющийся вопрос. В этом SO-вопросе есть элегантный ответ:
getWidth() и getHeight() View возвращает 0
Какой (бесстыдно скопированный) должен переопределить onWindowFocusChanged(), который, похоже, срабатывает сразу после onCreate() и где размеры отображаются:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//Here you can get the size!
}
Ответ 4
Вы можете выполнять любую работу, требующую размеров в onResume
(используя флаг типа alreadyDone
, чтобы не повторять его каждый раз, когда Activity
выходит за рамки). В onCreate
представления не отображаются, поэтому они нормальны, что размеры являются нулями.