7

Ho diversi layout nidificati che sto cercando di ruotare di 90 gradi a richiesta nel codice. Ho la parte setRotation di cose che funzionano bene, ma sfortunatamente le cose non stanno ridimensionando abbastanza bene con la rotazione. La larghezza su questi elementi è impostata su match_parent e, dopo la rotazione, continua a far corrispondere la larghezza genitore, non l'altezza genitore a cui deve corrispondere.Come aggiornare match_parent in un linearLayout dopo aver usato setRotation?

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> 

rotazione del codice Java

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 mostra l'immagine prima che si verifichi la rotazione.

This picture mostra l'immagine dopo la rotazione.

Come si può vedere, l'intera casella è stata ruotata dopo che l'altezza e la larghezza sono già state impostate. Nella versione non ruotata la larghezza (match_parent) dovrebbe essere a schermo intero e l'altezza (layout_weight = 2) dovrebbe essere 2/3 dello schermo. Funziona bene. Il problema è dopo che ruota, quelle dimensioni rimangono le stesse invece di adattarsi e cambiare alla nuova rotazione.

Ho inserito alcuni colori di sfondo chiari per aiutare a risolvere il problema, che Rosa che stai vedendo si trova nel LinearLayout principale, non in nessuno dei layout che vengono ruotati.

Ho provato a includere la rotazione nello xml stesso, anziché all'interno del codice, e ho ottenuto gli stessi esatti risultati dell'immagine successiva, quindi è chiaramente qualcosa che non capisco su come ottenere le larghezze del layout nel modo in cui Voglio. Posso semplicemente non usare layout_weight in modo efficace con la rotazione?

+0

Per quel che vale non ho mai fatto risolvere questo problema.Ho finito per creare file XML separati con e senza la rotazione e utilizzando un VerticalTextView personalizzato come suggerito [qui] (http://stackoverflow.com/questions/1258275/vertical-rotated-label-in-android) per ottenere il mio testo ruotare. Funziona come un fascino, anche se i file XML multipli sono un po 'più schifosi di quanto sarebbe stata una semplice rotazione. –

+0

Non ho (ancora) una risposta carina, ma penso che questo possa essere ottenuto prendendo le dimensioni del genitore della vista e impostando le dimensioni della vista in modo che corrispondano. I.e., int width = ((Visualizza) myView.getParent()). GetWidth(); ',' myView.setLayoutParams (new FrameLayout.LayoutParams (larghezza, altezza)); '. Sto avendo alcuni problemi con la posizione, però, ma penso di poterli superare con alcune combinazioni di 'setPivotX()' e 'setX()'. – VinceFior

+0

Scambia i valori di altezza e peso dei parametri di layout e ripristina i parametri di layout della vista quando lo ruoti. –

risposta

1

Penso che si stia verificando lo stesso problema descritto in questo Stack Overflow question. Sembra che la rotazione non venga semplicemente presa in considerazione ai fini del layout. In altre parole, il layout si verifica e la rotazione avviene con le viste disposte prima della rotazione.

Questo answer alla stessa domanda può essere d'aiuto.

È anche possibile regolare manualmente le misurazioni. In entrambi i casi è un po 'disordinato, ma penso che sia così.


È possibile caricare un layout alternativo che si comporterà come si desidera invece di eseguire la rotazione. (Vedi layout e immagine sotto). Puoi anche ottenere lo stesso risultato modificando i parametri di layout a livello di codice.

Questo è un project on GitHub che dimostra di eseguire la rotazione a livello di codice. La vista ruota dopo una pausa di tre secondi.

Spero che lo trovi utile.

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>