wake-up-neo.net

Wie bekomme ich die sichtbare Größe einer Aktivität?

Wie kann ich die sichtbare Größe meiner Aktivität erfahren? 

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

29
Tsimmi

Ich habe einen Weg gefunden, die genaue Höhe meiner Aktivität zu ermitteln: 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 ermitteln.

13
Tsimmi

Ich denke Sie wollen Activity.getWindow() und Window.getDecorView() betrachten und die Breite/Höhe davon erhalten.

38
Dave

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

In jedem Moment danach kann die Größe von Ihrem Stammlayout (LinearLayout/FrameLayout/TableLayout/etc) abgerufen werden. In meinem Fall verwendete ich FrameLayout:

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 aus bearbeitet ------------------------------------------- ---------

Ich habe einen Weg gefunden, diese Informationen über die onCreted-Methode zu erhalten, aber nur, wenn Sie mehr als eine Aktivität haben. In meinem Fall habe ich eine Haupttätigkeit, die eine Zweittätigkeit aufruft. 

Auf main_activity kann ich vor dem Aufruf der second_activity durch ein neues Itent zusätzliche Informationen für die second_activity hinzufügen. Hier ist der Code, den Sie für die erste Aktivität benötigen:

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

Danach können Sie bei Ihrer zweiten Aktivität diese Informationen über die onCreate-Methode Ihrer zweiten Aktivität abrufen, indem Sie Folgendes tun:

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

Ich mag zeitsparende Antworten mehr:

myActivity.getWindow().getDecorView().getHeight();
myActivity.getWindow().getDecorView().getWidth();
3
Zon

Es gibt eine einfache Möglichkeit, die richtige Größe der Ansicht mithilfe der getDefaultSize-Funktion zu ermitteln. Wenn View die gesamte Aktivität umfasst, können Sie den nächsten Ansatz verwenden, um Dimensionen der Aktivitäts-Clientregion abzurufen:

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

So erweitern Sie die Ansicht für die gesamte Aktivität:

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);
3
Weaknespase

Wenn Sie DataBinding verwenden (wie Sie es sein sollten), können Sie binding.getRoot().getHeight() aufrufen, wobei binding Ihre ViewDataBinding ist, die mit DataBindingUtil.setContentView() oder einer anderen solchen DataBindingUtil-Methode erstellt wurde. Sie müssen warten, bis das Layout die Größe hat. Dies können Sie folgendermaßen 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 Sie den OnGlobalLayoutListener entfernen müssen. Andernfalls wird der OnGlobalLayoutListener bei jeder Änderung Ihres Layouts ausgeführt.

2
LukeWaggoner

Holen Sie sich die Höhe der Aktivität:

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

Holen Sie sich die Breite der Aktivität

public static int getActivityWidth(Activity activity)
{
    return activity.findViewById(Android.R.id.content).getWidth();
}
1
Hans

Sie erhalten height und width als 0 bei den Methoden onCreate ()/onStart ()/onResume (). Grund ist, dass die Größe noch nicht festgelegt ist .. Wenn Sie die aktuelle Größe wissen möchten, verwenden Sie Observer besser in einer dieser Methoden und tun, was Sie wollen, wenn Sie die aktuelle Größe erhalten.

constraint_layout ist ein Layoutwurzelelement im folgenden Code:

ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_layout);
constraintLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout()  {
        constraintLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int width = constraintLayout.getWidth();
        int height = constraintLayout.getHeight();
        doSmthMethod(width, height);
    }
});
0
Serg.Stankov