2012-03-03 293 views
3

我有一個水平的LinearLayout,它的程序用孩子填充。我希望能夠切換到從右到左的佈局(即,兒童0在最右側,兒童1在其左側等)。問題是,我希望佈局從RtL切換到LtR並動態返回,這就是爲什麼例如this question與我的情況無關。水平LinearLayout與從右至左排列的子項?

似乎沒有辦法直接在代碼中設置它,特別是因爲引力是用於對齊,而不是排序。

到目前爲止,我看到了以下解決方法:

  • 在訂貨開關,重新添加孩子倒順序(問題:極醜和資源消耗)。 (:由於具有限制性的能見度輔助佈局成員大量的複製粘貼的Android的源問題)
  • 與一個重寫onLayout()方法實現的的LinearLayout一個子類。
  • 用另一個例如LinearLayout代替。一個TableLayoutRelativeLayout,並改變開關(問題:仍有點kludgey)的孩子的佈局參數。

有沒有更直接的解決方案或更好的解決方法?

編輯:爲了澄清,我在活動運行期間幾乎創建了一次孩子,我可以將它們存儲在一個輔助數組/集合中,而不會對代碼造成任何影響。

+0

您正在添加孩子來一次佈置一個或將它們與循環一起添加? – MKJParekh 2012-03-03 08:13:21

+0

這是一個循環,我可以將引用存儲在輔助結構中,而不會太複雜。我將編輯這個問題來澄清這一點。 – 2012-03-03 12:09:57

回答

3

重新創建孩子可能是資源密集型的,重新排序不應該那麼糟糕。您可以使用getChildAtgetChildCount獲取現有視圖,然後使用addView override with an index重新放入。

+0

這就是提到的第一個解決方法。看看佈局方法的來源,還有很多事情要做,但也許我太擔心了。不過,我會等待其他答案,因爲我問了一個預感問題,我錯過了一些明顯的東西。 – 2012-03-03 12:17:41

+0

是的,做了一點緩存,效果很好。 – 2012-04-12 23:10:47

2

做一個LinearLayout.setRotationY(180)。您還必須將線性佈局的子視圖的Y旋轉也設置爲180。例如:

private void horizontal() { 
    LinearLayout layout = (LinearLayout) v.findViewById(R.id.layout); 
    View childView1 = (View) v.findViewById(R.id.childView1); 
    View childView2 = (View) v.findViewById(R.id.childView2); 

    layout.setRotationY(180); 
    childView1.setRotationY(180); 
    childView2.setRotationY(180); 
} 

該代碼可能是錯誤的,但您明白了。