以编程方式添加LinearLayouts不是等间距

时间:2013-01-31 23:59:51

标签: android android-layout

在Android 4.0中以编程方式构建部分UI时,我遇到了一些间距问题。我试图将风格化的按钮添加到风格化的LinearLayout。为了平均分隔按钮,每个按钮都包含在一个权重为1的LinearLayout中。我开始使用XML定义的布局(有点概念证明),它呈现出我想象的那样:

<LinearLayout android:id="@+id/dialog_footer" 
        android:layout_width="500dp"
        android:layout_height="wrap_content"
        android:background="@drawable/dialog_footer">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:gravity="center">
        <Button android:id="@+id/cancel"
            style="@style/Button"
            android:layout_width="130dp"
            android:layout_height="38dp"
            android:text="Cancel" />
    </LinearLayout>

    <!-- Another LinearLayout with a nested Button like the one above -->

</LinearLayout>

为了以编程方式添加按钮,我删除了内部LinearLayouts并将它们放在他们自己的布局文件中,我可以膨胀并添加到Java中的外部LinearLayout。几乎相同。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:gravity="center" >
    <Button android:id="@+id/button"
            style="@style/Button"
            android:layout_width="130dp"
            android:layout_height="38dp" />
</LinearLayout>

这大致是我在代码中添加按钮的方式:

LinearLayout dialogFooter = (LinearLayout)dialogView.findViewById(R.id.dialog_footer);
LinearLayout wrappedButton = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_button_wrapped, null);

Button button = (Button)wrappedButton.findViewById(R.id.button);
button.setText(R.string.button_one_text);

// button.setOnClickListener(...);

dialogFooter.addView(wrappedButton);

按钮出现但现在它们被组合在一起并向左移动。如果我正在添加到dialog_footer中,那么当解析一个我需要自己做的布局时Android会做什么吗?由于权重在这里发挥作用,我认为在我正在添加到(dialog_footer)的容器上调用setWeightSum()可能是必要的,但这没有帮助。有没有人有任何想法可能导致XML和Java方法之间的差异?

1 个答案:

答案 0 :(得分:-2)

我相信这是你的问题:

LinearLayout wrappedButton = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_button_wrapped, null);

应该用父视图替换null,以便它将获得要为其设置的layoutParams。

另一件事是关于你设置的重量 - 你应该将宽度/高度设置为0px,这样重量不会导致布局过程以一种奇怪/低效的方式工作。

顺便说一句,您可以删除内部布局(包含按钮)并使用单个按钮。只需将layout_gravity设置为center_horizo​​ntal。