2012-12-16 43 views
13

Làm cách nào để đảo ngược hướng của bố cục tuyến tính?Đảo ngược hướng của LinearLayout

ví dụ: nếu bố cục của tôi là [view1, view2, view3], tôi muốn tạo [view3, view2, view1]. Mục tiêu của tôi là thổi phồng một phiên bản bên trái và bên phải từ một bố cục XML.

Trả lời

10

Nói chung tôi có thể nói bạn không thể thực hiện việc này bằng SDK chuẩn. Tuy nhiên, bạn có thể tạo một phương thức nhận tất cả các bản xem con ra khỏi LinearLayout, loại bỏ chúng khỏi LinearLayout và sau đó thêm chúng ngược lại theo thứ tự ngược lại.

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 đây là một giải pháp tốt mặc dù, nó hoạt động tự động. nhưng anh ấy biết quan điểm r cùng loại thì giải pháp của tôi tốt hơn. anyway +1 cho điều này. :) –

+0

Một sửa đổi nhỏ, tôi đã thay đổi "<=" trong vòng thứ hai cho vòng lặp thành "> =". Nó hoạt động hoàn hảo! Cảm ơn. – ZeroEric

+0

bắt tốt. đã sửa. – mtmurdock

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

Bây giờ bạn có thể thử này

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 

đây bởi Xem, nó có thể được TextView, Nút .... vv.

+0

Đây là một giải pháp tốt, b ut sẽ chỉ hoạt động nếu cả ba chế độ xem (hoặc ít nhất là lượt xem đầu tiên và cuối cùng) đều có cùng loại. Nếu chúng là các loại khác nhau hoặc có các thuộc tính khác nhau thì sao? Giải pháp của bạn sẽ không đảo ngược chúng. – mtmurdock

+0

@mtmurdock trong trường hợp đó anh ta phải sử dụng một if-else theo logic của mình. –

+0

Nếu không thì không thể thay đổi loại đối tượng. Những gì bạn đang đề xuất không thay đổi thứ tự, nó chỉ thay đổi dữ liệu được lưu trữ trong mỗi lần xem cho sự xuất hiện của việc thay đổi thứ tự. – mtmurdock

0

Làm cách nào để đảo ngược hướng của bố cục tuyến tính?

Điều đó không được hỗ trợ, xin lỗi.

Mục tiêu của tôi là thổi phồng một phiên bản bên trái và bên phải từ một bố cục XML.

Bạn có thể thổi phồng cả hai từ một bố cục XML, nhưng sau đó bạn sẽ cần xóa tất cả các con của một và đảo ngược thứ tự của chúng trong mã Java. Có thể điều này đơn giản hơn việc duy trì hai tệp bố cục riêng biệt, nhưng nó chắc chắn không phải là tự động.

Hoặc, bạn có thể tạo lớp con của riêng mình là LinearLayout (hoặc có thể sao chép LinearLayout) cung cấp tính năng này.

Android 4.2 trở lên offers RTL support for LinearLayout, nhưng được liên kết với ngôn ngữ và sẽ áp dụng cho tất cả các vùng chứa ngang LinearLayout trong ứng dụng của bạn.

2

Cách đơn giản cố gắng thông báo

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

này cho trước câu trả lời, nếu bạn muốn giữ chiều rộng/chiều cao quan điểm, tính bằng cách trực tiếp thông qua (tức là điền phụ huynh/nội dung wrap), bạn có để đặt chúng rõ ràng:

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

có lẽ bạn sẽ phải sử dụng bài đăng để xem đảm bảo kích thước lượt xem. và thêm trình xử lý cho các thay đổi định hướng để các kích thước được tính toán lại chính xác.

2

đây là cách tiếp cận đơn giản nhất :)

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

đúng, đây là câu trả lời đơn giản và tốt nhất! – Sloosh

2

Bạn có thể điều khiển theo hướng bố trí trực tiếp thông qua các layoutDirection.Trong mã này, chúng tôi phát hiện xem hướng tự nhiên là RTL, và đảo ngược hướng, rõ ràng là người ta có thể áp dụng logic của riêng bạn để đảo ngược:

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

Hoặc qua XML trong trường hợp bạn muốn ghi đè lên theo hướng tự nhiên liên tục:

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

Phát hiện RTL được lấy từ câu hỏi này: Identifyng RTL language in Android

+0

Giải pháp siêu mát mẻ nếu bạn minSdkVersion là 17 – murt

0

Bạn có thể thử ViewCompat.setLayoutDirection(view, direction)