以编程方式设置LinearLayout子项的权重

5

我有一个垂直的LinearLayout LL_p,它有两个子水平LinearLayouts LL_1和LL_2,它们又各自有自己的子元素。根据LL_1和LL_2的可见内容,我想动态地改变它们在LL_p中的相对权重。我已经有一个包含大量细节的xml布局,不希望丢失它,所以我只需要增量地改变权重。我该怎么做?这是我的xml:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=“0.2”
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/ll_1”
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.55"
            android:background="@drawable/some_image”
            android:orientation="vertical" >

            <!—- a number of includes —>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_2”
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.45"
            android:layout_marginBottom="@dimen/dim_1”
            android:background="@color/some_colorandroid:orientation="horizontal" >

            <!—- a number of children —>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

所以在Java活动类中,我需要以下方法,但我需要帮助完成它。请注意,我没有实例化新的布局参数,因为那样会导致我失去我的xml布局细节;相反,我使用getLayoutParams从xml中获取一个设置。那么,我如何使获得的布局权重改变呢?

private void adjustMYLayout(boolean flip) {
    LayoutParams layout1 = mLL1.getLayoutParams();
    LayoutParams layout2 = mBLL2.getLayoutParams();
    //now what?
    if(flip) {//set one weight system
    }else {
        //set other weight system
    }
}

@nKn 的更新

private void adjustMYLayout(boolean flip) {

  if (flip) {
    mLL1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8f));
         mLL2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2f));
  } else {
    mLL1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.55f));
    mLL2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 0.45f));
  }
}
1个回答

6
您可以通过声明一个LinearLayout.LayoutParams对象来实现这一点。
tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));

第三个参数 (1f) 是布局的权重 (在本例中为 1 (f 代表 float)).

你所说的“tv”是指mLL1或mLL2吗?但是,如果我担心丢失现有的xml中设置的细节,比如mLL1的背景、填充等呢?我相信我知道如何按照你的建议去做。但是这样做意味着从头开始,因此我必须重新传递所有其他内容:边距、背景等。这就是我想避免的。或者我误解了吗? - Katedral Pillon
谢谢。但是您的方法实际上丢失了我的marginBottom,这意味着我需要做一些工作来将10dp更改为像素,然后使用setMargins(0,0,0,convertedDp2Px)添加回去。我的问题是特别为了避免这样的“混乱”。我希望Android提供更好的更改权重的功能。 - Katedral Pillon
你已经拥有我的XML文件了。我刚刚更新了OP,展示了我正在使用的Java方法,这是基于你的答案的。 - Katedral Pillon
在我看来,似乎没问题,但我不明白为什么你的边距会被修改。如果我查到什么信息,我会尝试进行研究并发表一些东西。 - nKn
1
我相信我已经通过将 LinearLayout.LayoutParams.WRAP_CONTENT 更改为 0 使其正常工作。 - Katedral Pillon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接