【问题标题】:Why LinearLayout's margin is being ignored if used as ListView row view如果用作 ListView 行视图,为什么 LinearLayout 的边距会被忽略
【发布时间】:2013-04-29 12:01:34
【问题描述】:

我在想,如果我只提供一层LinearLayout 作为 ListView 的行视图,它的边距将被忽略。

如果使用 ListView 的行视图,边距将被忽略

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="5dp"

但是,如果我提供双层LinearLayout,第一层作为“虚拟”层,它的边距不会被忽略。

我们将在 ListView 的行视图中有边距

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/buyPortfolioLinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"

我可以知道为什么会这样吗?

【问题讨论】:

  • 我的观察是所有带有 layout 前缀的属性都是指这个 UI 元素与其父元素的关系,并且可以被父元素覆盖,而没有 的属性layout 指的是这个 UI 元素与其子元素的关系。你试过用“padding”代替“layout_margin”吗?
  • 相同。在 LinearLayout 的最外层使用边距或填充也将被忽略。

标签: android


【解决方案1】:

事实是,LinearLayout(子)的边距要求其父布局(容器)给子布局一个 x 值的边距。

因此,如果父布局的 LayoutParams 支持边距,则该边距将得到尊重和应用。

ListView默认使用AbsListView.LayoutParams,它不包括任何边距支持,只有高度和宽度,这就是为什么,它只是忽略了边距的参数值。

而其他布局参数,如 ActionBar.LayoutParamsFrameLayout.LayoutParamsGridLayout.LayoutParamsLinearLayout.LayoutParamsRelativeLayout.LayoutParamsViewGroup.MarginLayoutParams 的子级,它尊重子级的边距值。

【讨论】:

  • 抱歉打扰了。我有一个带有 textViews 的线性布局,并在那里设置了 weight 属性。当我使用该布局作为我的 listRow 视图(以编程方式)时,weight 属性将被忽略,我的 textView 会被推到另一个旁边。
  • @Razgriz 你应该打开一个新问题并在那里提供详细信息和代码,因为这似乎是一个不同的查询。
  • 有没有办法在 LinearLayout 中覆盖这种行为,以便动态更改视图的宽度(例如)会忽略边距并更改其宽度?
  • ListView 理解android:padding,所以如果可能(取决于你的布局结构和你的目标)你可以使用 android:padding 属性。现在最理想的是使用RecyclerView
【解决方案2】:

当您使用单一布局时,这意味着这是您的窗口,如果您在其上应用边距,那么您将从父视图中请求该数量的边距,但我们没有父视图,因此边距将不起作用. 第二位是父视图,边距将有助于内部视图,但对外部视图没有帮助。

【讨论】:

    【解决方案3】:

    您可以像这样使用填充,而不是添加嵌套布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="5dp"
    

    【讨论】:

    • 这行不通,因为问题指出具有单个布局不会应用填充,但嵌套会。我刚刚遇到了同样的问题。
    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2017-11-07
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多