2012-12-16 11 views
13

Come è possibile invertire la direzione di un layout lineare?Invertire la direzione di un LinearLayout

ad esempio, se il mio layout è [view1, view2, view3] Voglio creare [view3, view2, view1]. Il mio obiettivo è quello di gonfiare istanze di sinistra e di destra da un layout XML.

risposta

10

In generale, direi che non è possibile farlo utilizzando l'SDK standard. Tuttavia, è possibile creare un metodo che rimuova tutte le sottoview dal LinearLayout, rimuoverle dal LinearLayout e quindi reinserirle in ordine inverso.

LinearLayout ll = // inflate 
ArrayList<View> views = new ArrayList<View>(); 
for(int x = 0; x < ll.getChildCount(); x++) { 
    views.add(ll.getChildAt(x)); 
} 
ll.removeAllViews(); 
for(int x = views.size() - 1; x >= 0; x--) { 
    ll.addView(views.get(x)); 
} 
+0

@mtmmurdock questa è una buona soluzione, però, funziona in modo dinamico. ma conosce le opinioni dello stesso tipo, quindi la mia soluzione è migliore. comunque +1 per questo. :) –

+0

Una correzione minore, ho cambiato il "<=" nel secondo per il ciclo su "> =". Ha funzionato perfettamente! Grazie. – ZeroEric

+0

buona presa. fisso. – mtmurdock

0
<LinearLayout 
    android:id="@+id/parent" 
    ...... 
    ......> 
    view1 
    view2 
    view2 
<LinearLayout/> 

Ora si può provare questo

LinearLayout parent = (LinearLayout)findViewById(R.id.parent); 
View view1 = (View)parent.getChildAt(0); // it will give first view 
View view3 = (View)parent.getChildAt(2); // it will give you third view 

Here di View, può essere TextView, Button .... ecc.

+0

questa è una buona soluzione, b ut funzionerà solo se tutte e tre le visualizzazioni (o almeno la prima e l'ultima) sono dello stesso tipo. Cosa succede se sono di tipo diverso o hanno proprietà diverse? La tua soluzione non invertirà quelle. – mtmurdock

+0

@mtmurdock in tal caso deve usare uno se-altro secondo la sua logica. –

+0

Se else non può modificare il tipo di un oggetto. Quello che stai proponendo non cambia l'ordine, ma modifica semplicemente i dati memorizzati in ogni vista dando l'impressione di cambiare l'ordine. – mtmurdock

0

Come è possibile invertire la direzione di un layout lineare?

Questo non è supportato, mi spiace.

Il mio obiettivo è quello di gonfiare istanze sinistra e destra da un layout XML.

Siete invitati a gonfiarli entrambi da un layout XML, ma dovrete quindi rimuovere tutti i figli di uno e invertire il loro ordine nel codice Java. Può essere che questo sia più semplice rispetto al mantenimento dei due file di layout separati, ma non è sicuramente automatico.

Oppure, siete invitati a creare la vostra sottoclasse di LinearLayout (o forse clone LinearLayout) che offre questa funzionalità.

Android 4.2 e versioni successive offers RTL support for LinearLayout, ma è legato alle impostazioni internazionali e si applica a tutti i contenitori orizzontali LinearLayout nell'app.

2

modo semplice provare questo avviso

LinearLayout ll = (LinearLayout)findViewById(R.id.ll1); 
    View v0 = ll.getChildAt(0); 
    View v1 = ll.getChildAt(1); 
    View v2 = ll.getChildAt(2); 

    ll.removeAllViews(); 

    ll.addView(v2); 
    ll.addView(v1); 
    ll.addView(v0); 
0

per le risposte prev, se si vuole preservare la larghezza/altezza di punti di vista, calcolato dal passaggio diretto (cioè riempire genitore contenuti/involucro), si ha per impostare esplicitamente:

for (int i = views.size() - 1; i >= 0; i--) 
{ 
    View v = views.get(i); 
    linearLayoutHor.addView(v, v.getWidth(), v.getHeight()); 
} 

forse si dovrà utilizzare post per visualizzare per essere sicuri che le dimensioni di vista vengono calcolati. e aggiungi il gestore per le modifiche all'orientamento in modo che le dimensioni vengano ricalcolate correttamente.

2

questo è l'approccio più semplice :)

for(int k = ll.getChildCount()-1 ; k >= 0 ; k--) 
{ 
    View item = ll.getChildAt(k); 
    ll.removeViewAt(k); 
    ll.addView(item); 
} 
+0

giusto, questa è la risposta più semplice e migliore! – Sloosh

2

È possibile controllare la direzione del layout direttamente attraverso il layoutDirection.In questo codice si rileva se il senso naturale è RTL, e invertire la direzione, ovviamente, si può applicare la propria logica di inversione:

LinearLayout buttonsContainer = (LinearLayout) findViewById(R.id.buttonsContainer);   
buttonsContainer.setLayoutDirection(isRTL() ? LinearLayout.LAYOUT_DIRECTION_LTR : 
            LinearLayout.LAYOUT_DIRECTION_RTL) 

public static boolean isRTL() { 
     return isRTL(Locale.getDefault()); 
} 

public static boolean isRTL(Locale locale) { 
    final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0)); 
    return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT || 
      directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC; 
} 

O tramite XML nel caso in cui si desidera ignorare la direzione naturale costantemente:

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:layoutDirection="ltr" 
     > 
... 
</LinearLayout> 

rilevamento di RTL è preso da questa domanda: Identifyng RTL language in Android

+0

Soluzione super cool se la versione di minSdk è 17 – murt

0

si può provare ViewCompat.setLayoutDirection(view, direction)