getSize() no es compatible con versiones anteriores del sistema operativo Android, getWidth() / getHeight() en desuso

Entonces, ¿cómo escribo código para acomodar esto? No quiero dejar llamadas API en desuso en mi código, pero tampoco quiero perder a los usuarios con dispositivos (ligeramente) más antiguos. ¿Hay algún tipo de configuración de compatibilidad que pueda implementar?

rel. código

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

vs. el método anterior:

int screen_width = getWindowManager().getDefaultDisplay().getWidth();
int screen_height = getWindowManager().getDefaultDisplay().getHeight();

preguntado el 03 de mayo de 12 a las 21:05

5 Respuestas

tengo dos funciones, enviar el contexto y obtener la altura y el ancho en píxeles.

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.HONEYCOMB){                   
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // deprecated
    }
    return width;
}

y

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.HONEYCOMB){               
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }else{          
        height = display.getHeight();  // deprecated
    }
    return height;      
}

respondido 23 nov., 12:19

La mejor opción (y por mejor, me refiero a la opción que funcionaría casi siempre) sería usar la reflexión. Echa un vistazo a Android Compatibilidad al revés Compatibilidad al revés directrices (actualizado con nueva ubicación del artículo sobre reflexión).

Si bien la respuesta de tyczj funcionará perfectamente siempre que las funciones obsoletas aún estén en el SDK, tan pronto como se eliminen, no tendrá forma de usarlas o ejecutar su aplicación en un dispositivo más antiguo si aún desea compilar con el SDK más reciente. .

Reflection resuelve este problema al detectar dinámicamente de manera efectiva la función en tiempo de ejecución, lo que significa que incluso si compila contra ICS, siempre que minSdkVersion sea correcto, puede hacer que su aplicación se ejecute en un dispositivo con Gingerbread o Froyo, por ejemplo.

contestado el 02 de mayo de 13 a las 18:05

Todavía no había visto esa parte de los documentos del desarrollador, buena respuesta. - karl_

Es bastante oscuro si no sabes qué buscar, me topé con él por accidente. - RivieraNiño

Entonces, ¿qué es la reflexión. Creo que ese enlace ahora está muerto. - EGHDK

puedes hacer algo como esto

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
           //do stuff pertaining to this version here
}else{
           //other versions
}

contestado el 03 de mayo de 12 a las 21:05

Desafortunadamente, esto solo funcionará mientras los métodos antiguos estén en el SDK de compilación. @karl_, no indica explícitamente la antigüedad del dispositivo que desea admitir, pero usar la reflexión como en mi respuesta le permitirá admitir cualquier versión de Android, independientemente del SDK con el que esté creando. - RivieraNiño

Creo que lo que sugiere RivieraKid sería algo como esto:

static Point getDisplaySize(Display d)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        return getDisplaySizeGE11(d);
    }
    return getDisplaySizeLT11(d);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
static Point getDisplaySizeGE11(Display d)
{
    Point p = new Point(0, 0);
    d.getSize(p);
    return p;
}
static Point getDisplaySizeLT11(Display d)
{
    try
    {
        Method getWidth = Display.class.getMethod("getWidth", new Class[] {});
        Method getHeight = Display.class.getMethod("getHeight", new Class[] {});
        return new Point(((Integer) getWidth.invoke(d, (Object[]) null)).intValue(), ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());
    }
    catch (NoSuchMethodException e2) // None of these exceptions should ever occur.
    {
        return new Point(-1, -1);
    }
    catch (IllegalArgumentException e2)
    {
        return new Point(-2, -2);
    }
    catch (IllegalAccessException e2)
    {
        return new Point(-3, -3);
    }
    catch (InvocationTargetException e2)
    {
        return new Point(-4, -4);
    }
}

Respondido 17 Abr '13, 15:04

Por lo general, tengo una súper clase, es decir. BaseActivity con un método genérico para obtener un punto con el tamaño de pantalla actual. Mantiene todo agradable y limpio en la actividad real.

/**
 * Return screen size as a point.
 * @return
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
@SuppressWarnings("deprecation")
protected Point getSize() {
    final Point point = new Point();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
        getWindowManager().getDefaultDisplay().getSize(point);
    }
    else {
        final Display display = getWindowManager().getDefaultDisplay();
        point.x = display.getWidth();
        point.y = display.getHeight();
    }
    return point;
}

contestado el 22 de mayo de 14 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.