Android Как найти полезную область отображения

#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? Спасибо