7

Ich habe mehrere verschachtelte Layouts, die ich bei Bedarf im Code um 90 Grad drehen möchte. Ich habe das SetRotation Teil der Dinge funktioniert gut, aber leider sind die Dinge nicht ganz richtig mit der Rotation. Die Breite dieser Elemente wird auf "Match_parent" festgelegt. Nach der Drehung entspricht sie immer noch der übergeordneten Breite und nicht der übergeordneten Höhe, auf die sie passen soll.Wie match_parent in einem linearLayout nach der Verwendung von setRotation aktualisieren?

XML

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="link.basiclifecounter.LifeCounter" 
    android:background="#CC00CC"> 

    <LinearLayout 
     android:id="@+id/topPlayers" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:orientation="vertical" 
     android:background="#CC0000"> 

     <RelativeLayout 
      android:id="@+id/p3" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/p2" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottomPlayer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" 
     android:background="#00CC00"> 

     <RelativeLayout 
      android:id="@+id/p1" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 
    </LinearLayout> 
</LinearLayout> 

Rotation Java-Code

view.findViewById(R.id.topPlayers).setRotation(90); //Rotate the entire top box 
view.findViewById(R.id.p3).setRotation(180); //Flip one side so both players face outwards 

This picture zeigt das Bild vor der Rotation auftritt.

This picture zeigt das Bild nach der Rotation.

Wie Sie sehen können, wurde die gesamte Box gedreht, nachdem die Höhe und Breite bereits festgelegt wurden. In der nicht gedrehten Version sollte die Breite (match_parent) Vollbild sein und die Höhe (layout_weight = 2) sollte 2/3 des Bildschirms sein. Das funktioniert gut. Das Problem besteht darin, dass nach dem Drehen diese Größen gleich bleiben, anstatt sich an die neue Rotation anzupassen und zu ändern.

Ich warf einige helle Hintergrundfarben ein, um bei der Fehlersuche zu helfen. Das Pink, das Sie sehen, befindet sich im Haupt-LinearLayout, nicht in einem der Layouts, die gedreht werden.

Ich habe versucht, die Rotation in der XML selbst, anstatt innerhalb des Codes, und bekam genau die gleichen Ergebnisse wie die After-Bild, so ist es klar, etwas verstehe ich nicht, wie man die Layoutbreiten den Weg bekommen Ich will. Kann ich Layout_weight nicht effektiv mit Rotation verwenden?

+0

Für was es wert ich nie tat dies lösen.Ich habe am Ende separate XML-Dateien für mit und ohne Rotation erstellt und eine benutzerdefinierte VerticalTextView wie vorgeschlagen [http://stackoverflow.com/questions/1258275/vertical-rotated-label-in-android] verwendet, um meinen Text zu erhalten rotieren. Funktioniert wie ein Zauber, auch wenn die mehreren XML-Dateien ein wenig klobiger sind als eine einfache Rotation gewesen wäre. –

+0

Ich habe (noch) keine schöne Antwort, aber ich denke, dass dies erreicht werden kann, indem man die Dimensionen der Eltern der Ansicht erhält und die Abmessungen der Ansicht anpasst. B. "int width = ((View) myView.getParent()). GetWidth();', 'myView.setLayoutParams (neue FrameLayout.LayoutParams (width, height));'. Ich habe einige Probleme mit der Position, aber ich denke, dass ich diese mit einer Kombination von 'setPivotX()' und 'setX()' überwinden kann. – VinceFior

+0

Vertauschen Sie die Höhen- und Gewichtswerte der Layout-Parameter und setzen Sie die Layout-Parameter der Ansicht zurück, wenn Sie sie drehen. –

Antwort

1

Ich denke, dass Sie das gleiche Problem haben, wie in diesem Stack Overflow question beschrieben. Es scheint, dass die Rotation für Layout-Zwecke einfach nicht berücksichtigt wird. Mit anderen Worten, das Layout findet statt, und die Drehung erfolgt mit den Ansichten, die vor der Drehung angeordnet wurden.

Diese answer zu derselben Frage kann Ihnen helfen.

Sie können die Messungen auch manuell anpassen. So oder so ist ein bisschen unordentlich, aber ich denke, dass es so ist.


Sie könnten ein alternatives Layout laden, das sich wie gewünscht verhält, anstatt die Drehung auszuführen. (Siehe Layout und Bild unten.) Sie können das gleiche Ergebnis erzielen, wenn Sie die Layoutparameter programmgesteuert ändern.

Hier ist eine project on GitHub, die das Programm programmgesteuert ausführt. Die Ansicht rotiert nach einer Pause von drei Sekunden.

Ich hoffe, dass Sie das nützlich finden.

enter image description here

alternate.xml

<LinearLayout 
     android:id="@+id/topPlayers" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:background="#CC0000" 
     android:orientation="horizontal"> 

     <RelativeLayout 
      android:id="@+id/p3" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical" 
      android:rotation="90"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="p3" 
       android:textSize="48sp" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/p2" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:background="#0000CC" 
      android:gravity="center" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:rotation="-90" 
       android:text="p2" 
       android:textSize="48sp" /> 
     </RelativeLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottomPlayer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#00CC00" 
     android:orientation="vertical"> 

     <RelativeLayout 
      android:id="@+id/p1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="p1" 
       android:textSize="48sp" /> 
     </RelativeLayout> 
    </LinearLayout>