Подтвердить что ты не робот

Обратное направление LinearLayout

Как изменить направление линейного макета?

например, если мой макет [view1, view2, view3] Я хочу создать [view3, view2, view1]. Моя цель состоит в том, чтобы раздуть левые и правые экземпляры из одного XML-макета.

4b9b3361

Ответ 1

В общем, я бы сказал, что вы не можете сделать это, используя стандартный SDK. Тем не менее вы могли создать метод, который получает все подъязыки из LinearLayout, удаляет их из LinearLayout и затем добавляет их обратно в обратном порядке.

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

Ответ 2

Простой способ попробовать это

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

Ответ 3

это самый простой способ:)

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

Ответ 4

Вы можете управлять направлением макета непосредственно через layoutDirection. В этом коде мы определяем, является ли естественное направление RTL, и обратное направление, очевидно, можно применить свою собственную логику к обратному:

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

Или через XML, если вы хотите постоянно изменять естественное направление:

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

Обнаружение RTL взято из этого вопроса: Identifyng RTL-язык в Android

Ответ 5

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

Теперь вы можете попробовать это

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

Здесь Вид может быть TextView, Button... и т.д.

Ответ 6

Как изменить направление линейного макета?

Это не поддерживается, извините.

Моя цель состоит в том, чтобы раздуть левые и правые экземпляры из одного XML-макета.

Вы можете раздуть их как из одного XML-макета, но затем вам нужно будет удалить все дочерние элементы одного и отменить их порядок в Java-коде. Возможно, это проще, чем поддерживать два отдельных файла макета, но это определенно не автоматическое.

Или вы можете создать свой собственный подкласс LinearLayout (или, возможно, clone LinearLayout), который предлагает эту функцию.

Android 4.2 и выше предлагает поддержку RTL для LinearLayout, но привязана к языку и будет применяться ко всем горизонтальным контейнерам LinearLayout в вашем приложении.

Ответ 7

уведомление для предыдущих ответов, если вы хотите сохранить ширину/высоту представлений, вычисленных прямым переходом (т.е. заполнить родительский/переносимый контент), вы должны установить их явно:

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

возможно, вам придется использовать сообщение для просмотра, чтобы быть уверенным в размерах просмотров. и добавьте обработчик для изменений ориентации, чтобы размеры были правильно пересчитаны.

Ответ 8

Вы можете попробовать ViewCompat.setLayoutDirection(view, direction)