Android устарел от размера экрана?

Эй, мне нужно получить ширину экрана в моем приложении. Приложение будет работать на 2.1 и выше. Я настроил его так, как показано ниже. Этот метод устарел, и я, вероятно, должен использовать getSize или другой способ. Но вопрос в том, будет ли это работать на версиях Android, таких как 3.0+ и 4.0+, или это приведет к сбою приложения. Раньше я использовал устаревший метод в потоке, и это приводило к сбою приложения на устройствах с мороженым. Будет ли работать описанный ниже метод?

 Display display = getWindowManager().getDefaultDisplay(); 
     int width = display.getWidth();
     int height = display.getHeight();

РЕДАКТИРОВАТЬ:

Я пробовал getSize, но он не работает:

  Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);
      int width = size.x;
      int height = size.y;

person Ukjent    schedule 18.05.2012    source источник


Ответы (5)


Я не знаю, будут ли эти устаревшие методы работать на Android 3 и 4. Лучший способ узнать это — протестировать на эмуляторе.

Но самым безопасным методом здесь для максимальной совместимости будет попробовать один метод с использованием отражения и вернуться к другому. По сути, вы можете создать свою собственную версию getSize(), которая не подведет. Я не могу проверить этот банкомат, но он может выглядеть так:

void overrideGetSize(Display display, Point outSize) {
    try {
      // test for new method to trigger exception
      Class pointClass = Class.forName("android.graphics.Point");
      Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass });

      // no exception, so new method is available, just use it
      newGetSize.invoke(display, outSize);
    } catch(NoSuchMethodException ex) {
      // new method is not available, use the old ones
      outSize.x = display.getWidth();
      outSize.y = display.getHeight();
    }
}

Тогда, конечно, просто назовите это чем-то вроде

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
overrideGetSize(display, size);
person Steve Blackwell    schedule 18.05.2012
comment
Чтобы получить метод через отражение, вы должны передать массив классов его параметров. Вы должны указать параметры на случай, если метод перегружен. См. документы для getMethod(). Итак, мы создаем массив только из одного элемента для класса Point, поскольку getSize() принимает только этот один параметр. Это помогает? - person Steve Blackwell; 19.05.2012
comment
Или вы можете использовать не устаревшее Display получитьМетрики() - person Johan vdH; 05.11.2013
comment
@JohanvdH - Ты прав. getMetrics() существует со времен API 1 и, похоже, возвращает те же значения. Это, наверное, самый простой путь. - person Steve Blackwell; 05.11.2013

Я не уверен, но это может сработать:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int height = display.getHeight();
} else {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
}
person AndDev    schedule 18.05.2012

Я расширил полезный код Стива, чтобы Eclipse не выдавал никаких предупреждений или ошибок, а также немного реструктурировал его. Поскольку класс Point существует с уровня API 1, я не вижу особых преимуществ в его создании с помощью отражения.

  final static String mTAG = "MYTAG";

  // Cope with deprecated getWidth() and getHeight() methods
  Point getSize(Display xiDisplay) 
  {
    Point outSize = new Point();
    boolean sizeFound = false;

    try 
    {
      // Test if the new getSize() method is available
      Method newGetSize = 
        Display.class.getMethod("getSize", new Class[] { Point.class });

      // No exception, so the new method is available
      Log.d(mTAG, "Use getSize to find screen size");
      newGetSize.invoke(xiDisplay, outSize);
      sizeFound = true;
      Log.d(mTAG, "Screen size is " + outSize.x + " x " + outSize.y);
    } 
    catch (NoSuchMethodException ex) 
    {
      // This is the failure I expect when the deprecated APIs are not available
      Log.d(mTAG, "getSize not available - NoSuchMethodException");
    }  
    catch (InvocationTargetException e) 
    {
      Log.w(mTAG, "getSize not available - InvocationTargetException");
    } 
    catch (IllegalArgumentException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalArgumentException");
    } 
    catch (IllegalAccessException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalAccessException");
    }

    if (!sizeFound)
    {
      Log.i(mTAG, "Used deprecated methods as getSize not available");
      outSize = new Point(xiDisplay.getWidth(), xiDisplay.getHeight());
    }

    return outSize;
  }
person Dan J    schedule 22.08.2012

Согласно https://stackoverflow.com/a/1016941/2914140:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
person CoolMind    schedule 23.05.2016

Что не так с новой функцией Display, getSize ()? Было бы очень легко превратить объект Point в нужные вам значения ширины и высоты.

person Turnsole    schedule 18.05.2012
comment
Разве метод getSize() доступен только с уровня API 13 и выше, или я ошибаюсь? - person Ukjent; 19.05.2012
comment
Мы можем использовать widthPixels, чтобы получить информацию для: Абсолютной ширины дисплея в пикселях. stackoverflow.com/a/37391867/1815624 - person CrandellWS; 27.09.2018