2012-12-16 18 views
13

Jak mogę odwrócić kierunek układu liniowego?Odwróć kierunek LinearLayout

na przykład, jeśli mój układ to [widok1, widok2, widok3] Chcę utworzyć [widok3, widok2, widok1]. Moim celem jest nadmuchanie instancji lewej i prawej ręki z jednego układu XML.

Odpowiedz

10

Generalnie powiedziałbym, że nie można tego zrobić za pomocą standardowego zestawu SDK. Można jednak utworzyć metodę, która pobiera wszystkie subviews z LinearLayout, usuwa je z LinearLayout, a następnie dodaje je z powrotem w odwrotnej kolejności.

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 jest to dobre rozwiązanie, działa dynamicznie. ale zna poglądy r tego samego typu, wtedy moje rozwiązanie jest lepsze. w każdym razie +1 za to. :) –

+0

Jedna drobna korekta, zmieniłem "<=" w drugiej pętli for na "> =". Działało idealnie! Dzięki. – ZeroEric

+0

dobry połów. naprawiony. – mtmurdock

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

Teraz można spróbować tego

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 

tu View, to może być TextView Button .... itd.

+0

jest to dobre rozwiązanie, b ut działa tylko wtedy, gdy wszystkie trzy (lub przynajmniej pierwszy i ostatni) widok są tego samego typu. Co zrobić, jeśli mają różne typy lub mają różne właściwości? Twoje rozwiązanie nie odwróci ich. – mtmurdock

+0

@mtmurdock w takim przypadku musi użyć jednego, jeśli-else zgodnie z jego logiką. –

+0

Jeśli-else nie może zmienić typu obiektu. To, co proponujesz, nie zmienia kolejności, zmienia tylko dane przechowywane w każdym widoku, dając wrażenie zmiany zamówienia. – mtmurdock

0

Jak mogę odwrócić kierunek układu liniowego?

To nie jest obsługiwane, przepraszam.

Moim celem jest nadmuchanie instancji lewej i prawej ręki z jednego układu XML.

Zapraszamy do nadmuchania ich zarówno z jednego układu XML, ale trzeba będzie usunąć wszystkie dzieci jednego i odwrócić ich zamówienie w kodzie Java. Być może jest to prostsze niż zachowanie dwóch oddzielnych plików układu, ale zdecydowanie nie jest to automatyczne.

Możesz również utworzyć własną podklasę pod numerem LinearLayout (lub sklonować LinearLayout), która oferuje tę funkcję.

Android 4.2 i wyżej offers RTL support for LinearLayout, ale jest to związane z ustawieniami regionalnymi i dotyczyłoby wszystkich poziomych kontenerów LinearLayout w aplikacji.

2

Prosty sposób wypróbować ten

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

powiadomienia o odpowiedziach prev, jeśli chcesz zachować szerokość/wysokość widoki, obliczonych przez bezpośrednie przełęczy (tj wypełnić rodzic treść/owinąć), trzeba aby ustawić je jawnie:

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

Być może będziesz musiał użyć posta do wyświetlenia, aby upewnić się, że rozmiary wyświetleń są obliczane. i dodaj handler do zmiany orientacji, aby rozmiary zostały ponownie obliczone poprawnie.

2

to najprostsze podejście :)

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

prawda, to jest najprostsza i najlepsza odpowiedź! – Sloosh

2

można kontrolować kierunek układu bezpośrednio przez layoutDirection.W tym kodzie możemy wykryć, czy naturalny kierunek jest RTL i odwrócić kierunek, oczywiście można zastosować swoją własną logikę do cofania:

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; 
} 

Albo poprzez XML w przypadku, gdy chcesz zastąpić naturalny kierunek stale:

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

Wykrywanie RTL jest pobierana z tym pytanie: Identifyng RTL language in Android

+0

To super fajne rozwiązanie, jeśli minSdkVersion ma 17 – murt

0

można spróbować ViewCompat.setLayoutDirection(view, direction)