2012-05-03 12 views
8

Entonces, ¿cómo puedo escribir el código para acomodarlo? No quiero dejar llamadas obsoletas a la API en mi código, pero tampoco quiero perder usuarios con dispositivos (un poco) más antiguos. ¿Existe algún tipo de configuración de compatibilidad que pueda implementar?getSize() no es compatible con versiones anteriores del sistema operativo Android, getWidth()/getHeight() obsoleto

Rel. código

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

versus el método más antiguo:

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

Respuesta

3

El mejor (y por lo mejor, me refiero a la opción que trabajar más o menos cada vez) la opción sería usar reflexión. Echa un vistazo a las directrices de Android Backwards Compatibility Backwards Compatibility (actualizado con la nueva ubicación del artículo en la 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ás forma de usarlas o ejecutar tu aplicación en un dispositivo anterior si aún quieres construir contra el último SDK.

Reflection soluciona este problema al detectar dinámicamente la función en tiempo de ejecución, lo que significa que incluso si compila contra ICS, siempre que la minSdkVersion sea correcta, puede ejecutar su aplicación en un dispositivo con Gingerbread o Froyo para ejemplo.

+0

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

+0

Es bastante oscuro si no sabes qué buscar, me encontré con eso totalmente por accidente. – RivieraKid

+0

Entonces, ¿qué es el reflejo? Creo que ese enlace ahora está muerto. – EGHDK

3

que puede 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 
} 
+1

Bienvenido al mundo de la retrocompatibilidad. –

+0

Eso hizo el truco. Claro que hace cosas desordenadas. –

+0

Desafortunadamente, esto solo funcionará mientras los métodos antiguos estén en el SDK de compilación. @karl_, no declaras explícitamente la antigüedad del dispositivo que deseas admitir, pero si utilizas la función de reflexión como en mi respuesta, podrás admitir cualquier versión de Android, independientemente del SDK que estés creando. – RivieraKid

11

tengo dos funciones, enviando el contexto y obteniendo 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;  
} 
1

creo que tipo de cosas RivieraKid sugiere, 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); 
    } 
} 
0

por lo general tienen un decir súper clase. 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; 
} 
Cuestiones relacionadas