#android
#Android
Вопрос:
я пытаюсь найти полезную область отображения в своем приложении, чтобы я мог программно определять размеры. пока у меня есть следующее
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
Point size = new Point();
display.getSize(size);
final TypedArray styledAttributes = getBaseContext().getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
int actionBarHeight = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
int usableHeight = size.y - actionBarHeight;
что работает в большинстве случаев, но у меня есть планшет, на котором установлена строка меню сверху (высотой 32 пикселя), которая содержит время, состояние сети, уровень заряда батареи и т.д. (не знаю, есть ли для этого настоящее имя) и панель внизу (высотой 48 пикселей), на которой есть кнопка «Назад», клавиша «Приложения» и кнопка «снимок экрана».
мое устройство имеет размер 800×600, поэтому, когда я делаю display.getSize (размер); я получаю 552 = 600 — нижняя панель из 48 пикселей. проблема в том, что она не вычитает верхнюю панель.
итак, как мне получить доступ к этой верхней панели (если она существует), чтобы я мог найти истинную область приложения?
у меня есть другой планшет, на котором время, уровень заряда батареи и статус Wi-Fi отображаются на той же панели, что и кнопка «Назад», кнопка «Приложения», снимок экрана и т.д., Поэтому с этим проблем нет.
Спасибо
Ответ №1:
Чтобы получить область экрана, доступную для вашего приложения, вам нужно измерить родительский вид вашего собственного приложения:
final View view = getWindow().getDecorView().getRootView();
int scrLoc[] = new int[2];
top.getLocationOnScreen(scrLoc);
int BottomLoc[] = new int[2];
bottom.getLocationOnScreen(BottomLoc);
boolean portrait = getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE;
if (portrait) {
availableWidth = top.getWidth();
availableHeight = BottomLoc[1] - scrLoc[1];
} else {
availableWidth = top.getWidth();
availableHeight = BottomLoc[1] - scrLoc[1];
}
И, если вам нужны измерения перед onResume (скажем, при onCreate), вы будете
необходимо обернуть этот код в обратный вызов ViewTreeObserver
Наконец, если ваше приложение чувствительно к размеру экрана, вы, вероятно, также захотите изменить его внутреннее состояние при переключении ориентации экрана. Чтобы сделать это
в манифесте:
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation">
и в рамках действия:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
// your change orientation logic here
}
Комментарии:
1. вау, это намного больше, чем я ожидал. мне нужно сделать это до отображения экрана, для меня лучшим местом является onCreateOptionsMenu в onCreateOptionsMenu. как бы я поместил это туда? Спасибо.
2. привет, в этом примере, как вы инициализируете top и bottom? Спасибо