在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方法之间的差异?
答案 0 :(得分:-2)
我相信这是你的问题:
LinearLayout wrappedButton = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_button_wrapped, null);
应该用父视图替换null,以便它将获得要为其设置的layoutParams。
另一件事是关于你设置的重量 - 你应该将宽度/高度设置为0px,这样重量不会导致布局过程以一种奇怪/低效的方式工作。
顺便说一句,您可以删除内部布局(包含按钮)并使用单个按钮。只需将layout_gravity设置为center_horizontal。