0

在 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 方法之间的差异?

4

1 回答 1

-2

我相信这是你的问题:

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

null 应该替换为父视图,以便它可以获取您要为其设置的 layoutParams。

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

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

于 2013-02-01T00:20:39.963 回答