2010-06-17 26 views
24

Come posso conoscere la dimensione visibile della mia attività?Come ottenere la dimensione visibile su un'attività?

Sto cercando di ottenere la dimensione vera e propria attività,
non l'altezza e la larghezza da getHeight() e getWidth(),
che mi dà la dimensione dello schermo pieno.

+1

Perché vuoi farlo? Nella maggior parte dei casi questo non è necessario e la maggior parte delle cose che potrebbero essere necessarie può essere fatto con tecniche migliori fornite con Android per gestire schermi di dimensioni diverse. – Janusz

+3

Ho davvero bisogno di sapere quanti pixel ha l'attività nella sua larghezza e altezza. Ha a che fare con la precisione cartografica. – Tsimmi

+0

Stai utilizzando una vista mappa o una vista personalizzata per la visualizzazione della mappa? – Janusz

risposta

11

Ho trovato un modo per conoscere l'altezza esatta della mia attività: se si dispone di una vista che riempie tutto lo schermo disponibile dietro la barra del titolo e la barra delle attività, basta usare getBottom() per ottenere l'altezza reale di tale attività.

+0

getBottom() di cosa? Quale classe ha questo metodo? –

+0

Qualsiasi Vista: http://developer.android.com/reference/android/view/View.html#getBottom() è relativo alla madre che è il motivo per cui è necessario che sia una visione che riempie tutto lo schermo disponibile in questo caso. – Mike

+0

int height = this.getWindow(). GetDecorView(). GetBottom(); – kurt

31

io penso si vorrà guardare Activity.getWindow() e Window.getDecorView(), e ottenere la larghezza/altezza di questo.

+9

int height = this.getWindow(). GetDecorView(). GetHeight(); – fireydude

+1

Ricevo ancora 0, strano. – nomnom

+4

Lo stai chiamando troppo presto non ha altezza durante onCreate(). – Tatarize

6

L'ho fatto utilizzando il mio layout di root, il problema è che non è possibile ottenere queste informazioni (larghezza e altezza) nei metodi onCreate/onStart/onResume quando sono in esecuzione la prima volta.

Qualsiasi momento dopo che, le dimensioni possono essere recuperate dal layout root (LinearLayout/FrameLayout/TableLayout/etc), nel mio caso ho usato FrameLayout:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root); 
Log.d(TAG, "width " + f.getMeasuredWidth()); 
Log.d(TAG, "height " + f.getMeasuredHeight()); 

o:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root); 
Log.d(TAG, "width " + f.getRight()); 
Log.d(TAG, "height " + f.getBottom()); 

Modificato da qui --------------------------------------------- -----------

Ho trovato un modo per ottenere queste informazioni sul metodo onCreted, ma solo se hai più di una attività . Nel mio caso ho un'attività principale che chiama la seconda attività.

Su main_activity prima di chiamare la seconda_attività, da un nuovo Itent, posso aggiungere ulteriori informazioni per la seconda_attività. Ecco il codice necessario alla prima attività:

Intent i = new Intent(this, SecondActivity.class); 
i.putExtra("width", f.getMeasuredWidth()); 
i.putExtra("height", f.getMeasuredHeight()); 
startActivity(i); 

Dopo di che sul vostro seconda attività è possibile recuperare queste informazioni sul metodo onCreate della vostra seconda attività farlo:

int width = getIntent().getExtras().getInt("width"); 
int height = getIntent().getExtras().getInt("height"); 
2

C'è semplice modo per ottenere la giusta dimensione di visualizzazione utilizzando la funzione getDefaultSize.Nel caso di Vista si estende su tutta l'attività, è possibile utilizzare l'approccio successivo per ottenere dimensioni regione cliente attività:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec); 
    int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec); 
    ... 
} 

Per rendere View si estende su tutta l'attività:

MyView testView = new MyView(this); 
LinearLayout testViewGroup = new LinearLayout(this); 
testView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
              LayoutParams.FILL_PARENT); 
testViewGroup.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
               LayoutParams.FILL_PARENT); 
testViewGroup.addView(testView); 
setContentView(testViewGroup); 
1

ottenere l'altezza del attività:

public static int getActivityHeight(Activity activity) 
{ 
    return activity.findViewById(android.R.id.content).getHeight(); 
} 

Get la larghezza delle attività

public static int getActivityWidth(Activity activity) 
{ 
    return activity.findViewById(android.R.id.content).getWidth(); 
} 
2

Se si utilizza DataBinding (che si dovrebbe essere), è possibile chiamare binding.getRoot().getHeight() dove binding è il vostro ViewDataBinding creata con DataBindingUtil.setContentView() o altro metodo di DataBindingUtil. Sarà necessario attendere che il layout ha dimensioni, che si può fare in questo modo:

binding.getRoot().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     binding.getRoot().getViewTreeObserver().removeOnGlobalLayoutListener(this); 

     int height = binding.getRoot().getHeight(); 
    } 
}); 

Si noti che è necessario rimuovere l'OnGlobalLayoutListener altrimenti verrà eseguito questo ogni volta che qualcosa cambia nel layout.

0

mi piace risparmiare tempo risposte più:

myActivity.getWindow().getDecorView().getHeight(); 
myActivity.getWindow().getDecorView().getWidth(); 
Problemi correlati