1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Auslesen einer konkreten Pixelzahl von match_parent bei einem LinearLayout

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Terth, 17.11.2011.

  1. Terth, 17.11.2011 #1
    Terth

    Terth Threadstarter Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2011
    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
     
  2. v Ralle v, 17.11.2011 #2
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
  3. Terth, 18.11.2011 #3
    Terth

    Terth Threadstarter Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2011
    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
     
  4. v Ralle v, 18.11.2011 #4
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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
     
  5. Terth, 20.11.2011 #5
    Terth

    Terth Threadstarter Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2011
    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
     
  6. v Ralle v, 20.11.2011 #6
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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
     
    Terth bedankt sich.

Diese Seite empfehlen