android:如何平均划分线性布局元素

Posted

技术标签:

【中文标题】android:如何平均划分线性布局元素【英文标题】:android: how todivide linear layout elements equally 【发布时间】:2012-05-26 21:52:48 【问题描述】:

我有一个带有两个列表视图和两个死按钮的线性布局。如何在列表视图之间平均分配空间。我得到了一些建议,比如将高度设置为 0dip,但它没有用。 eclipse 中的图形布局显示了正确的布局,但是当我向列表中添加不同数量的元素时,它们会扩展到不同的高度。这是xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" 
    android:weightSum="2">

    <Button
        android:layout_
        android:layout_
        android:enabled="false"
        android:text="Installed engines" >
    </Button>

    <ListView
        android:id="@+id/primary"
        android:layout_
        android:layout_ 
        android:layout_weight="1" >
    </ListView>

    <Button
        android:layout_
        android:layout_
        android:enabled="false"
        android:text="Active engines" >
    </Button>

    <ListView
        android:id="@+id/secondary"
        android:layout_
        android:layout_ 
        android:layout_weight="1" >
    </ListView>

</LinearLayout>

谢谢

由于没有人相信我,这里是我所得到的图像。 只是链接,因为我没有足够的声誉来发布照片:( ! run ! eclipse

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

毕竟这可能不是基于这个答案Linear Layout and weight in Android的xml问题

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这对于静态 XML 布局是正确的。如果您在运行时动态添加视图,则需要使用带有布局参数的 addView,例如 addView(button, new LinearLayout.LayoutParams(0, height, 1));即使您使用正确的宽度和重量值来膨胀布局也是如此。 – Nuthatch 2011 年 9 月 3 日 21:41

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

我确实使用布局充气器将我的视图添加到选项卡。也许这就是问题所在.. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

这是我使用充气机时重现问题的示例代码。

public class TestActivity extends Activity 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        ParticipantsPanel p = new ParticipantsPanel(this);
        setContentView(p);
    


class ParticipantsPanel extends LinearLayout 
    public ParticipantsPanel(Context ctx) 
        super(ctx);

        LayoutInflater li = LayoutInflater.from(ctx);
        View myView = li.inflate(R.layout.participants, null);
        final ListView primary = (ListView) myView.findViewById(R.id.primary);
        final ListView secondary = (ListView) myView.findViewById(R.id.secondary);
        final ArrayAdapter<String> primaryA = 
            new ArrayAdapter<String>(ctx,R.layout.lvtext);
        final ArrayAdapter<String> secondaryA = 
            new ArrayAdapter<String>(ctx,R.layout.lvtext);

        primaryA.add("hello1");
        primaryA.add("hello2");
        primaryA.add("hello3");
        primaryA.add("hello4");
        primaryA.add("hello5");
        primaryA.add("hello6");
        primaryA.add("hello7");
        primaryA.add("hello8");

        secondaryA.add("select1");
        secondaryA.add("select2");

        primary.setAdapter(primaryA);
        secondary.setAdapter(secondaryA);

        addView(myView);
    

xxxxxxxxxxxxxxxxxxxxxxxxxx

又一次更新。 我认为问题出在 Nuthatch(我在一篇旧文章中提到的那个人)指出:addView() 只会弄乱静态 xml 中的任何布局,这是 imo 的宝贵经验。当我将 ParticipantsPanel 中的代码移动到主要活动并直接设置视图而不将其添加到另一个线性布局时,它按预期工作。我很感激解释为什么会这样,以及我如何仍然可以将我的代码放在一个类中并具有所需的行为。

【问题讨论】:

那是因为你应该设置layout_height="0dp" 我在帖子中提到过,但它没有用。请注意,它按预期工作,两者中的元素数量相同。但并非如此。 是的,我读过。这就是为什么这是评论而不是答案,尽管是答案。 你说这是答案吗?如果您可以修改 xml 以使其按预期工作,我将不胜感激。 将两个ListViewslayout_height 设置为0dp,因为K-ballo 已经说过将使列表具有相同的高度(即使两个ListViews 的行数不同) )。这到底怎么不适合你? 【参考方案1】:

您发布的代码不是一个很好的例子。当您使用LayoutInflater 时,两个ListViews 不占用相等空间的问题是因为您在没有提供父ViewGroup 的情况下扩展布局文件以获取其LayoutParams

如果你使用:

addView(myView, new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));

修改R.layout.participants并将父LinearLayout替换为merge标签并设置:

        this.setOrientation(LinearLayout.VERTICAL);
        this.setWeightSum(2.0f);
        li.inflate(R.layout.participants, this, true);

对于ParticipantsPanel

那么一切都会好起来的。

【讨论】:

这正是那个家伙,Nutatch 所警告的,即 addView 搞乱了布局静态布局参数。感谢您解释为什么会这样。 这对我有用 if (view == null) LayoutInflater inflater = LayoutInflater.from(parent.getContext());视图 = inflater.inflate(R.layout.single_list_item, parent, false); 【参考方案2】:

对于垂直方向,将加权视图的高度设置为 0px(或 0dp 或其他,0 在 android 上的所有单位中都是 0)。 水平方向做同样的事情,但宽度。

【讨论】:

这正是我所做的,但没有奏效。对于按钮等静态元素,它确实有效。我有两个具有不同内容的列表视图,它们以某种方式重新调整为不同的大小。我已经更新了 xml 文件。 我已经上传图片了。 这很奇怪。我知道可视化编辑器仍然不可信。想知道在真实设备上是否会得到相同的结果。无论如何,您知道,您可以使用一种解决方法,将每个列表视图放在一个具有权重的 frameLayout 中,而列表视图将尽可能多地扩展(匹配父级)。这应该限制 listViews 以便它们能很好地发挥作用。 我现在尝试了 FrameLayout,但没有成功。正如我编辑过的帖子中的那个人所说,我相当确信问题在于我使用充气机来显示视图。它只会忘记我设置的任何布局,除非我使用像 setLayoutParams(....) 这样的代码。 通过为每个视图(包括根)赋予不同的背景颜色,我发现您的根视图(称为“myView”)并没有占用它可以占用的全部空间,所以唯一缺少的是给它 layoutParams : myView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));现在它完美地工作了。对于未来的情况,我建议您为每个视图设置一个背景,以便了解问题所在。

以上是关于android:如何平均划分线性布局元素的主要内容,如果未能解决你的问题,请参考以下文章

Android线性布局使高度适应元素

Android Studio线性布局元素Listen

第八章 android-布局

android线性布局,如何居中?

为啥我不能在 Android 的水平线性布局中添加超过 2 个元素?

在线性布局中对齐元素