2012-05-18 20 views
14

Oye, necesito obtener el ancho de la pantalla en mi aplicación. La aplicación se ejecutará en 2.1 y hacia arriba. Lo he configurado como el siguiente. El método está en desuso y debería usar getSize o de otra forma. Pero la pregunta es: ¿Funcionará esto en las versiones de Android como 3.0+ y 4.0+, o hará que la aplicación falle. He usado un método obsoleto en un hilo antes e hizo que la aplicación fallara en dispositivos de helados. ¿Funcionará el siguiente método?Android obsoleto tamaño de pantalla?

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

EDIT:

He probado el getSize pero no consigo que funcione:

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

Respuesta

12

No sé si estos métodos en desuso funcionarán en Android 3 y 4. La mejor manera de saber es probar en un emulador.

Pero, el método más seguro aquí para lograr la máxima compatibilidad será probar un método utilizando la reflexión, y recurrir al otro. Básicamente, puede crear su propia versión de getSize() que no puede fallar. No puedo probar esta atm, pero podría tener este aspecto:

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(); 
    } 
} 

Luego, por supuesto a llamarlo con algo como

Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
overrideGetSize(display, size); 
+0

¿Puedes explicar qué significa nueva clase [] {pointClass}? – opc0de

+0

Para obtener un método a través de la reflexión, debe pasar una matriz de las clases de sus parámetros. Debe especificar los parámetros en caso de que el método esté sobrecargado. Ver documentos para ['getMethod()'] (https://developer.android.com/reference/java/lang/Class.html). Así que estamos creando una matriz de solo un elemento para la clase 'Point', ya que' getSize() 'toma solo ese parámetro. ¿Eso ayuda? –

+0

gracias soy bastante nuevo en el mundo de java – opc0de

0

Lo que está mal con la nueva función de visualización, getSize()? Sería realmente fácil convertir el objeto Point en los valores de ancho y alto que necesita.

+2

método no es el getSize() sólo disponible, desde api lvl 13 y hacia arriba o estoy equivocado? – Ukjent

23

No estoy seguro, pero esto puede funcionar:

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; 
} 
+0

getHeight() ahora está en desuso ... –

3

He extendido el código útil de Steve para que Eclipse no dé ninguna advertencia o error, y también lo he reestructurado ligeramente. Como la clase Point estuvo presente desde el nivel 1 de la API, no vi muchos beneficios al crearla a través de la reflexión.

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; 
    } 
Cuestiones relacionadas