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;
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);
Я не уверен, но это может сработать:
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;
}
Согласно /questions/17654519/poluchit-razmeryi-ekrana-v-pikselyah/17654554#17654554:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
Я расширил полезный код Стива, чтобы 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;
}
Что не так с новой функцией Display, getSize ()? Было бы очень легко превратить объект Point в нужные вам значения ширины и высоты.