如何在线性布局中指定元素所在的边?

时间:2018-07-31 18:54:29

标签: android android-layout position android-linearlayout

我希望两个按钮并排放置,而Add按钮位于Remove按钮的左侧。这些按钮以编程方式插入。当只有一个按钮时,它应该占据所有空间。到目前为止,我有这个:

<LinearLayout
   android:id="@+id/buttonLayout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal">
   <include layout="@layout/add_button" />
   <include layout="@layout/remove_button" />
</LinearLayout>

添加按钮文件:

<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/addAdditionalColors"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:onClick="addColor"
    android:text="@string/addMore"
    xmlns:android="http://schemas.android.com/apk/res/android" />

删除按钮文件:

<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/removeAdditionalColors"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="@string/remove"
    xmlns:android="http://schemas.android.com/apk/res/android" />

这是我想要的方式。移除一个按钮后,另一按钮将占据屏幕的整个宽度。但是,假设我在屏幕上有一个Remove按钮,并且正在以编程方式添加Add按钮。由于它是最后添加的,因此将添加到Remove的右侧。如何避免这种情况(最好在XML文件中),而不是删除两个按钮并使用Java按顺序添加它们?这是所需的位置:

enter image description here

编辑: 我尝试在添加视图时添加索引:

buttonLayout.addView(removeButton, 1);

buttonLayout.addView(addButton, 0);

定位是正确的,但是由于某些原因,即使我将按钮的宽度设置为match_parent,也不是所有空间都被填满了。请查看视频HERE

这是处理按钮更新的完整代码:

public void addColor(View view){
            //do stuff
            if(numColors == 4){
                removeView(findViewById(R.id.addAdditionalColors));
                //function above appears to work fine
            }
           else if(numColors == 3){
                final View removeButton = inflater.inflate(R.layout.remove_button, null);
                buttonLayout.addView(removeButton, 1);
            }
    }
    public void removeColor(View view){
        //do stuff
        if(numColors == 3) {
            final View addButton = inflater.inflate(R.layout.add_button, null);
            buttonLayout.addView(addButton, 0);
        }
        else if(numColors == 2){
            removeView(findViewById(R.id.removeAdditionalColors));
        }
    }

1 个答案:

答案 0 :(得分:2)

要添加到LinearLayout的末尾,请执行以下操作:

linearLayout.addView(view);

要添加到LinearLayout的开头,请执行以下操作:

linearLayout.addView(view, 0);

上面的第二个addView()方法采用一个索引参数,并通过传递0来告知它希望新视图位于所有其他视图之前。

编辑

以编程方式添加的视图不能完全覆盖整个原因的原因是,此行为是三件事的组合:

  • 通过layout_weight属性
  • 启用LinearLayout中的“拉伸”
  • 以编程方式膨胀的视图使用null作为父参数
  • layout_属性在没有父项的情况下会被忽略

要使所有功能正常工作,您可以做的最小更改就是更改:

final View removeButton = inflater.inflate(R.layout.remove_button, null);

对此:

final View removeButton = inflater.inflate(R.layout.remove_button, buttonLayout, false);

通过将buttonLayout作为父级,您的layout_weight属性将能够正常运行。当然,您还必须对“添加”按钮进行类似的更改。