2012-03-03 292 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); 
} 

该代码可能是错误的,但您明白了。