2013-06-14 18 views
5

Come posso ottenere l'altezza disponibile dello schermo in Android? Ho bisogno dell'altezza meno la barra di stato/barra dei menu o qualsiasi altra decorazione che potrebbe essere sullo schermo e ho bisogno che funzioni per tutti i dispositivi. Inoltre, ho bisogno di sapere questo nella funzione onCreate. So che questa domanda è stata fatta prima, ma ho già provato le loro soluzioni e nessuna di esse funziona. Ecco alcune delle cose che ho provato:Come ottengo l'altezza dello schermo in Android?

Ciò non tiene conto della barra di stato bar/menù:

Display display = getWindowManager().getDefaultDisplay(); 
screenWidth = display.getWidth(); 
screenHeight = display.getHeight(); 

Né fa questo:

Point size = new Point(); 
getWindowManager().getDefaultDisplay().getSize(size); 
screenWidth = size.x; 
screenHeight = size.y; 

Né questo:

Point size = new Point(); 
getWindowManager().getDefaultDisplay().getRealSize(size); 
screenWidth = size.x; 
screenHeight = size.y; 

Questo non funziona:

Display display = getWindowManager().getDefaultDisplay(); 
DisplayMetrics metrics = new DisplayMetrics(); 
display.getMetrics(metrics); 
// since SDK_INT = 1; 
screenWidth = metrics.widthPixels; 
screenHeight = metrics.heightPixels; 
try 
{ 
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar) 
    screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
    screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
} 
catch (Exception ignored) 
{ 
    // Do nothing 
} 
try 
{ 
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar) 
    Point realSize = new Point(); 
    Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); 
    screenWidth = realSize.x; 
    screenHeight = realSize.y; 
} 
catch (Exception ignored) 
{ 
    // Do nothing 
} 

ho poi utilizzato il seguente codice per sottrarre l'altezza della barra di stato e barra menu dall'altezza schermo:

int result = 0; 
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
if (resourceId > 0) 
    result = getResources().getDimensionPixelSize(resourceId); 
screenHeight -= result; 
result = 0; 
if (screenHeight >= screenWidth) 
    resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); 
else 
    resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android"); 
if (resourceId > 0) 
    result = getResources().getDimensionPixelSize(resourceId); 
screenHeight -= result; 

Su API 17 dà correttamente calcola l'altezza della barra di stato e di menu barra in verticale ma non in orizzontale. Su API 10, restituisce 0. Ho bisogno di lavorare in posizione ideale su tutti i dispositivi o API minima 10.

+0

Hai provato questo codice: http://stackoverflow.com/a/13026919/611600 – Ali

+0

Sì, l'ho provato. Vedi la mia risposta qui sotto. Grazie –

+0

possibile duplicato di [Ottieni l'altezza dello schermo in Android] (http://stackoverflow.com/questions/17353822/get-the-screen-height-in-android) –

risposta

0

Ecco come sono riuscito ad ottenere le dimensioni dello schermo corrette per tutti i dispositivi:

public class MainActivity extends Activity 
{ 
    static int ScreenWidth; 
    static int ScreenHeight; 
    static int ScreenWidthLandscape; 
    static int ScreenHeightLandscape; 

    private RelativeLayout layout; 
    private RelativeLayout.LayoutParams params; 
    private View top; 
    private View bottom; 

    @SuppressWarnings("deprecation") 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     layout = new RelativeLayout(this); 
     top = new View(this); 
     bottom = new View(this); 
     RelativeLayout.LayoutParams viewParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); 
     viewParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     top.setLayoutParams(viewParams); 
     viewParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); 
     viewParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
     bottom.setLayoutParams(viewParams); 
     layout.addView(top); 
     layout.addView(bottom); 
     setContentView(layout); 
     final Intent intent = new Intent(this, myPackage.learnSpanishVerbs.Start.class); 

     final View view = getWindow().getDecorView().getRootView(); 
     ViewTreeObserver vto = view.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       int topLoc[] = new int[2]; 
       top.getLocationOnScreen(topLoc); 
       int BottomLoc[] = new int[2]; 
       bottom.getLocationOnScreen(BottomLoc); 
       boolean portrait = getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE; 
       if (portrait) 
       { 
        ScreenWidth = top.getWidth(); 
        ScreenHeight = BottomLoc[1] - topLoc[1]; 
       } 
       else 
       { 
        ScreenWidthLandscape = top.getWidth(); 
        ScreenHeightLandscape = BottomLoc[1] - topLoc[1]; 
       } 

       if (Build.VERSION.SDK_INT < 16) 
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       else 
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       startActivity(intent); 
       finish(); 
      } 
     }); 
    } 
} 
+0

Hai davvero bisogno di quelle viste dall'alto e dal basso? Non è sufficiente avere un layout che copre l'intero schermo e ottenere la sua altezza in 'onGlobalLayout'? –

0

La soluzione migliore che sono riuscito a venire in mente è questa:

Display display = getWindowManager().getDefaultDisplay(); 
DisplayMetrics metrics = new DisplayMetrics(); 
display.getMetrics(metrics); 
screenWidth = metrics.widthPixels; 
screenHeight = metrics.heightPixels; 

TypedValue tv = new TypedValue(); 
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
{ 
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) 
     screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); 
} 

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
if (resourceId > 0) 
    screenHeight -= getResources().getDimensionPixelSize(resourceId); 

ho provato su API 7 - 17. Sfortunatamente, su API 13 c'è spazio extra in basso sia in orizzontale che in verticale e su API 10, 8 e 7 non c'è abbastanza spazio nella parte inferiore sia in orizzontale che in verticale. (Non ho testato su API obsolete).

+0

sei riuscito a trovare una soluzione a questo? – Jaydev

0

Hai provato a eseguire i calcoli di altezza in onWindowFocusChanged della classe Attività? Questo elimina i problemi di API calcolando ciò che si vuole veramente, non fare scherzi con le barre dei menu, ecc

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
     View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT); 
     screenHeight=content.getHeight(); 
} 
+0

Non ho provato questo, ma funzionerà solo se è chiamato prima di 'OnCreate'. –

+0

Solo per la mia istruzione, quali metodi o comandi stai utilizzando che devono essere completi prima di onCreate? Nella mia soluzione, sono stato in grado di spostare molte delle funzionalità da onCreate a onWindosFocusChange e le cose sono apparse correttamente una volta che lo schermo è stato visualizzato per l'utente. – smirciat

+0

Ho semplicemente bisogno di ottenere l'altezza e la larghezza corrette dello schermo prima o durante OnCreate in modo che possa dare ai miei oggetti la dimensione e la posizione corrette. Ce l'ho fatta. Vedi la mia soluzione. Inoltre, il tuo codice non funzionerà perché OnCreate viene chiamato per primo. Grazie comunque per il tuo aiuto –

Problemi correlati