Auslesen einer konkreten Pixelzahl von match_parent bei einem LinearLayout

T

Terth

Neues Mitglied
0
Hallo,

kurz und knapp. ich habe ein linearLayout welches match_parent und 80 als breite und höhe hat. drehe ich jetzt das tablet und wechsle in den portrait modus wird mein linearlayout von der breite her kleiner. ich brauche aber den konkreten wert wie breit das layout im landscape oder portrait modus gerade ist (für eine berechnung wieviele buttons einer bestimmten größe ohne zu scrollen in das linlay passen würden).
Frage: GIBT ES EINEN WEG DEN WERT VON MATCH_PARENT IN EINER SITUATION (LANDSCAPE O. PORTRAIT) IN DP AUSZULESEN??

danke
terth
 
Hallo,

danke für deine Antwort. Für diese Code Zeilen bräuchte ich doch einen dps wert:
Code:
final float scale = getContext().getResources().getDisplayMetrics().density;  
int pixels = (int) (dps * scale + 0.5f);
diese dps variable muss doch dann aus meiner Viewgroup kommen deren width ich dynamisch, trotz match_parent berechnen möchte. getWidth liefert mir allerdings immer 0, obwohl ich ja sehen kann das das rote layout in meinem test über den bildschirm bis zu seinem nachbar layout geht, also augenscheinlich nicht null. diesen wert brauche ich. gibt es da noch eine möglichkeit an die pixel values zu kommen?

in meinem test hier ist es das ziel eine dp zahl oder eine andere größeninformation aus dem roten layout zu ermitteln um dynamisch die anzahl an buttons zu berechnen die reinpassen würde. die muss natürlich unterschiedlich sein je nachdem ob ich landscape oder portrait habe.
ich poste dir hier mal meinen test:

main.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/labels"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/buttons"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/widthLabel"
            android:layout_width="wrap_content"
            android:layout_height="80dp"
            android:text="LinLayWidth below: "
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/infoLabel"
            android:layout_width="wrap_content"
            android:layout_height="80dp"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/areaRight"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="#ff00ff00"
        android:orientation="vertical" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/buttons"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/labels"
        android:layout_toLeftOf="@+id/areaRight"
        android:background="#ffff0000"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>
Activity
Code:
public void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
}
vielen dank
liebe grüße
Terth
 
Die Umrechnung sollte jetzt kein Problem mehr darstellen. Eine View hat immer als Höhe und Breite 0, wenn die Werte noch nicht berechnet wurden. In der onCreate Methode wirst du beispielsweise immer 0 erhalten, weil die Layoutgröße noch nicht feststeht!

Zum Testen könntest du beispielsweise mal einen Button hinzufügen und in der onClick Methode die Höhe bzw. Breite abfragen. Ich wette, jetzt sind die Werte nicht mehr 0 ;)

Die Frage ist nun, wo man die Abfrage richtig platziert. Ich nutze in der Regel einen OnGlobalLayoutListener. Mit ihm kann man Statusänderungen der View oder Sichtbarkeit der Kinder in der View abfangen. Hier ein Snippet:

Code:
		imageView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				if (viewHeight == 0 || viewWidth == 0) {
					viewHeight = imageView.getHeight();
					viewWidth = imageView.getWidth();
				}
			}
		});

Beachte, dass die onGlobalLayout Methode keine Parameter hat und sie wird definitiv öfter aufgerufen. Daher ist es empfehlenswert zu überprüfen, ob der gesamte Methodenbody ausgeführt werden muss!

Falls es dich interessiert, die Methode habe ich auch in meiner Shutdown App eingebunden. Dort geht es um eine Grafik, die entsprechend skaliert werden muss, wenn die Höhe und Breite der View feststeht. Mit dem Listener klappt es wunderbar.

Viele Grüße
 
Hallo,

hat super geklappt das ist echt eine verdammt praktische Methode. Das schreib ich auf jeden Fall in meine Seminararbeit. Ich fertige gerade für die uni und die arbeit eine art guide durch android an. natürlich kein anspruch auf vollständigkeit aber das ist schon cool.

danke
grüße
Terth
 
Kein Problem :) Freut mich, dass es klappt.

Und noch eine Anmerkung zum Forum (auch wenn es bettelnd rüberkommt, was es nicht soll :D ), es gibt hier einen Danke Button, der auch betätigt werden darf ;)

Viele Grüße
 
  • Danke
Reaktionen: Terth

Ähnliche Themen

H
Antworten
2
Aufrufe
1.311
Hcman
H
D
  • Data2006
Antworten
14
Aufrufe
486
jogimuc
J
A
Antworten
10
Aufrufe
1.021
swa00
swa00
Zurück
Oben Unten