2010-06-17 11 views
24

Wie kann ich die sichtbare Größe meiner Aktivität erkennen?Wie erhält man die sichtbare Größe einer Aktivität?

Ich versuche, die Aktivität reale Größe zu bekommen,
nicht die Höhe und Breite von getHeight() und getWidth(),
die mir den Bildschirm in voller Größe gibt.

+1

Warum wollen Sie das tun wollen? In den meisten Fällen ist dies nicht notwendig und die meisten Dinge, die Sie brauchen könnten, können mit besseren Techniken, die mit Android kommen, um verschiedene Bildschirmgrößen zu behandeln. – Janusz

+3

Ich muss wirklich wissen, wie viele Pixel die Aktivität in ihrer Breite und Höhe hat. Es hat mit kartografischer Präzision zu tun. – Tsimmi

+0

Verwenden Sie eine Kartenansicht oder eine benutzerdefinierte Ansicht zum Anzeigen der Karte? – Janusz

Antwort

11

Ich habe eine Möglichkeit gefunden, die genaue Höhe meiner Aktivität zu kennen: Wenn Sie eine Ansicht haben, die alle verfügbaren Bildschirme hinter der Titelleiste und der Taskleiste ausfüllt, verwenden Sie einfach getBottom(), um die tatsächliche Höhe dieser Aktivität zu erhalten.

+0

getBottom() von was? Welche Klasse hat diese Methode? –

+0

Beliebige Ansicht: http://developer.android.com/reference/android/view/View.html#getBottom() es ist relativ zu dem Elternteil, weshalb Sie es brauchen, um eine Ansicht zu sein, die den ganzen verfügbaren Bildschirm ausfüllt in diesem Fall. – Mike

+0

int Höhe = this.getWindow(). GetDecorView(). GetBottom(); – kurt

31

ich denken Sie bei Activity.getWindow() und Window.getDecorView(), aussehen wollen und die Breite/Höhe davon bekommen.

+9

int höhe = this.getWindow(). GetDecorView(). GetHeight(); – fireydude

+1

Ich bekomme immer noch 0, seltsam. – nomnom

+4

Sie rufen es zu früh an, da es während onCreate() keine Höhe hat. – Tatarize

6

Ich habe das mit meinem Root-Layout, das Problem ist, dass Sie diese Informationen (Breite und Höhe) in Ihrer onCreate/onStart/onResume -Methoden nicht erhalten, wenn sie zum ersten Mal ausgeführt werden.

jederzeit danach kann die Größe von Ihrem Root-Layout (Linearlayout/FrameLayout/Tablelayout/etc), war ich mit FrameLayout in meinem Fall abgerufen werden:

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

oder:

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

Von hier bearbeitet --------------------------------------------- -----------

Ich habe einen Weg gefunden, diese Informationen auf der onCreted-Methode zu erhalten, aber nur, wenn Sie mehr als eine Aktivität haben . In meinem Fall habe ich eine Hauptaktivität, die zweite Aktivität aufruft.

Auf main_activity bevor ich die second_activity durch einen neuen Itent aufrufen, kann ich zusätzliche Informationen für die second_activity hinzufügen. Hier ist der Code, den Sie auf der ersten Aktivität benötigen:

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

Danach auf Ihre zweite Aktivität, die Sie diese Informationen auf der onCreate Methode Ihrer zweiten Aktivität abrufen können tun, dass:

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

Es ist einfach Weg, um richtig zu sehen Größe unter Verwendung getDefaultSize Funktion.Im Falle der Ansicht Spanning auf gesamte Aktivität können Sie nächsten Ansatz zu bekommen Aktivität Client-Bereich Dimensionen verwenden:

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

Um Blick auf ganze Tätigkeit erstreckt:

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

Erhalten Sie die Höhe der Aktivität:

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

Get die Breite der Aktivität

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

Wenn Sie Databinding verwenden (was Sie sein sollte), können Sie binding.getRoot().getHeight() nennen, wo binding ist Ihr ViewDataBinding mit DataBindingUtil.setContentView() oder anderen solchen DataBindingUtil Methode erstellt. Sie müssen warten, bis die Layoutgröße hat, die Sie wie folgt tun:

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

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

Beachten Sie, dass die OnGlobalLayoutListener zu entfernen, sonst werden sie dies jedes Mal etwas Änderungen im Layout ausgeführt werden.

0

Ich mag zeitsparende Antworten mehr:

myActivity.getWindow().getDecorView().getHeight(); 
myActivity.getWindow().getDecorView().getWidth(); 
Verwandte Themen