2011-12-31 18 views

risposta

0

partire Andorid 3.2, l'altezza della barra di stato del sistema non è incluso in altezza di DisplayMetrics, è necessario utilizzare le API non documentate (Display.getRawWidth() e Display.getRawHeight()) per ottenere la larghezza o l'altezza dello schermo fisico.

Method mGetRawW = Display.class.getMethod("getRawWidth"); 
Method mGetRawH = Display.class.getMethod("getRawHeight"); 

int nW = (Integer)mGetRawW.invoke(dp); 
int nH = (Integer)mGetRawH.invoke(dp); 

AGGIORNATO: Per API 13-16, è necessario utilizzare il codice sopra riportato per ottenere larghezza/altezza reali. Per API 17+, ora puoi utilizzare la nuova API pubblica, Display.getRealSize()

+0

Cosa c'è dp in (Integer) mGetRawW.invoke (dp); E restituirà l'altezza con il menu Soft incluso. – Herry

+0

Mi dà un'eccezione NoSuchMethodException. – DevAndroid

+0

Che cos'è dp? Inoltre, non è stato possibile trovare entrambi i metodi (Eccezione NoSuchMethod) – Alqueraf

12

Questo metodo è molto utile per impostare il layout di riempimento in Android KitKat (4.4). Usando questo, puoi evitare che la barra dei pulsanti morbidi si sovrapponga al tuo layout.

Procedimento getRealMetrics è disponibile solo con API 17 e +, ma sto solo utilizzando il seguente metodo che ho scritto per dispositivi su API 19+

@SuppressLint("NewApi") 
private int getSoftbuttonsbarHeight() { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

Testato su Nexus 5 & Nexus 7 2013.

+0

Sembra che vengano restituiti risultati errati per la modalità di visualizzazione orizzontale – Sergii

+0

Non ho riscontrato alcun problema con la modalità orizzontale. Il tuo metodo viene chiamato di nuovo sul cambio di rotazione? – chteuchteu

+2

no, volevo dire che in alcuni casi è necessario controllare la differenza in larghezza ma non in altezza. Quando i softkey sono a destra dello schermo ruotato in modalità orizzontale? – Sergii

2

Una risposta molto tarda ma per chiunque incontri questo problema. Un modo semplice per ottenere la quantità di spazio utilizzabile che compensa qualsiasi softkey/barra di navigazione o anche la barra di stato, è utilizzare getWindowVisibleDisplayFrame (Rect) da DecorView di Apps. Questo caricherà un oggetto Rect con la dimensione del display che è effettivamente utilizzabile.

Poiché non è possibile ottenere direttamente un riferimento a DecorView di Activiy, è necessario prima ottenere la finestra dell'attività utilizzando il metodo di accesso, getWindow(). Ciò restituirà l'oggetto finestra che contiene l'attività e altri elementi dello schermo. Per ottenere il decorView che contiene l'attività e le decorazioni dello schermo, ad esempio la barra di stato, la barra di navigazione/la barra dei pulsanti, il metodo di accesso alla chiamata getDecorView(). Una volta che hai un riferimento alla chiamata DecorView getWindowVisibleDisplayFrame (Rect) e avrai un oggetto Rect caricato.

Problemi correlati