2012-05-03 8 views
8

Quindi, come posso scrivere il codice per adattarlo? Non voglio lasciare chiamate API deprecate nel mio codice, ma non voglio perdere utenti con dispositivi (leggermente) meno recenti. Esiste una sorta di impostazione di compatibilità che posso implementare?getSize() non supportato nelle versioni precedenti del sistema operativo Android, getWidth()/getHeight() deprecato

Rel. Codice

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

rispetto al vecchio metodo:

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

risposta

3

Il meglio (e migliore, voglio dire l'opzione che avrebbe funzionato più o meno ogni volta) l'opzione sarebbe quella di utilizzare la riflessione. Consulta le linee guida per Android Backwards Compatibility Backwards Compatibility (aggiornate con la nuova posizione dell'articolo sulla riflessione).

Mentre la risposta di tyczj funzionerà perfettamente fintanto che le funzioni obsolete sono ancora nell'SDK, non appena saranno rimosse non sarà possibile utilizzarle o eseguire l'app su un dispositivo precedente se si vuole ancora costruire contro l'ultimo SDK.

Reflection risolve questo problema rilevando in modo efficace la funzione in fase di runtime, il che significa che anche se si crea contro ICS, fintanto che minSdkVersion è corretto, è possibile eseguire l'app su un dispositivo con Gingerbread o Froyo per esempio.

+0

Non avevo ancora visto quella parte dei documenti dello sviluppatore, buona risposta. –

+0

È piuttosto strano se non sai cosa cercare, sono inciampato su di esso per sbaglio. – RivieraKid

+0

Quindi cos'è il riflesso. Credo che il link sia ora morto. – EGHDK

3

si può fare qualcosa di simile

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

benvenuto nel mondo della retrocompatibilità. –

+0

Questo ha fatto il trucco. Certo fa cose confuse però. –

+0

Sfortunatamente, questo funzionerà solo fino a quando i vecchi metodi sono nell'SDK di build. @karl_, non si specifica in modo esplicito quanti anni un dispositivo si desidera supportare, ma l'utilizzo di reflection come nella mia risposta consentirà di supportare qualsiasi versione di Android indipendentemente dall'SDK che si sta creando. – RivieraKid

11

ho due funzioni, inviando il contesto e ottenendo altezza e larghezza in pixel.

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

e

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

penso genere di cose RivieraKid sta suggerendo, sarebbe qualcosa di simile:

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

solito ho una classe di super-es. BaseAttività con un metodo generico per ottenere un punto con le dimensioni dello schermo correnti. Mantiene tutto bello e pulito nell'attività reale.

/** 
* 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; 
}