自定义ListView的RelativeLayout中的Android布局居中

Posted

技术标签:

【中文标题】自定义ListView的RelativeLayout中的Android布局居中【英文标题】:Android layout centering in RelativeLayout for custom ListView 【发布时间】:2010-12-02 17:48:58 【问题描述】:

我真的把头发拉出来了。一些背景。我有一个项目列表,它们旁边都有复选框。当您取消选择复选框时,会出现一个按钮,允许您从列表中删除该项目。起初这似乎是倒退的,但我们只希望“选定”项目有资格进行进一步处理等。这是我的布局:

<RelativeLayout android:id="@+id/rlBlahBlah" 
                android:layout_ 
                android:layout_
                android:minHeight="?android:attr/listPreferredItemHeight"
                xmlns:android="http://schemas.android.com/apk/res/android">
  <CheckBox android:text="" 
            android:id="@+id/cbDeleteItem" 
            android:layout_ 
            android:layout_
            android:layout_gravity="center_vertical"
            android:focusable="false"
            />
  <TextView android:text="" 
            android:id="@+id/tvItemText" 
            android:layout_ 
            android:layout_ 
            android:textSize="14dip"
            android:paddingLeft="3dip"
            android:paddingRight="3dip"
            android:paddingTop="13dip"
            android:gravity="fill_vertical"
            android:layout_toRightOf="@id/cbDeleteItem"
            />
  <Button android:layout_ 
          android:id="@+id/btnDelete" 
          android:text="Delete" 
          android:layout_
          android:layout_alignParentRight="true"
          android:gravity="center_vertical"
          android:focusable="false"
          />
</RelativeLayout>

我无法让这 3 件物品在我的行中垂直居中以挽救我的生命。 layout_gravitygravitylayout_centerVertical,都不起作用。我确定我的问题是在某个地方翻转了一些微小的设置,但我真的对此束手无策。

编辑:我知道 textview 是“fill_vertical”,这是我正在尝试的一些随机的东西。

【问题讨论】:

您是否尝试过将重力属性应用于父级 RelativeLayout 视图?值得一试。 【参考方案1】:

此属性对我使用 RelativeLayout 居中 Button 有用:

android:layout_centerInParent="true"

看到这个帖子: Can you center a Button in RelativeLayout?

【讨论】:

谢谢你,它有时真的值得一读低评价的答案。 我找到的最佳答案 谢谢,对这个答案持怀疑态度,但这是解决这个问题的确切方法......这应该被接受的答案...... 如何判断是水平居中还是垂直居中?【参考方案2】:

您的问题可能不是由于布局,而是您如何膨胀布局。事实上,这甚至可能是我的错,这取决于你从哪里学到的技术......

引用无所不在的Romain Guy:

inflate() 的正确用法 适配器是:

inflate(layoutId, parent, false);

传递父级(作为 getView()) 中的参数允许 UI 工具包来创建适当的 布局参数对象。传递假 告诉工具包不要调用 parent.addView(theInflateChild),因为 ListView 稍后会发挥自己的魔力 开。

如果您使用inflate(layoutId, null),就像我传统上建议的那样,除非您尝试使用RelativeLayout 作为行的基本布局并尝试使用垂直居中,否则生活是可以的。

我将在接下来的几周内更新我的书籍等以反映新的建议。

【讨论】:

我实际上正在使用您的技术:P 我还阅读了 Romain Guy 的一篇文章,指出 RelativeLayout 忽略了 layout_gravity 属性。我正在发布一个完全符合我想要的新布局的答案。不过,感谢您的回复!【参考方案3】:

使用 RelativeLayout,我对重力和 layout_gravity 都没有运气。

android:layout_centerVertical="true" 为我工作,位于我的 RelativeLayout 的子级中,因此您可以根据需要保留它。

【讨论】:

宾果游戏!解决了我的问题。谢谢。【参考方案4】:

这是一个最终完全符合我要求的布局。一旦我得知 RelativeLayout 忽略了 layout_gravity 属性,我就放弃了(当然现在我找不到帖子了)。无论哪种方式,嵌套的 LinearLayouts 都为我解决了问题:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:id="@+id/llBlahBlahRowMain"
    android:padding="6dip">
    <CheckBox android:text="" 
              android:id="@+id/cbDeleteItem" 
              android:layout_ 
              android:layout_
              android:layout_gravity="center_vertical"
              android:focusable="false"
              />
    <LinearLayout
        android:orientation="vertical"
        android:layout_
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:layout_>
         <TextView 
            android:text="blah blah dynamically replaced text" 
            android:id="@+id/tvItemText" 
            android:layout_ 
            android:layout_ 
            android:layout_weight="1"
            android:textSize="14dip"
            android:paddingLeft="3dip"
            android:layout_gravity="center_vertical"
            />
    </LinearLayout>
    <Button android:layout_
          android:layout_ 
          android:id="@+id/btnDelete" 
          android:text="Delete" 
          android:layout_gravity="center_vertical" 
          android:focusable="false"
          />
</LinearLayout>

【讨论】:

【参考方案5】:

您是否尝试过 android:gravity="center_horizo​​ntal" 引用 here

【讨论】:

我正在寻找布局中的垂直居中。 那里还有一个center_vertical。 我发现的重力中心项目。我想要的是 layout_gravity,但根据我阅读的 Romain Guy 的一些帖子,RelativeLayout 最终忽略了 layout_gravity【参考方案6】:

我做了一个替代解决方案,它对我有用。我在我的文本框元素上放置了属性 android:layout_。这样,文本元素填充了父元素的所有高度,因此内容正确对齐:)

<TextView android:id="@+id/principal_li_descricao" 
    android:layout_
    android:layout_
    android:layout_marginLeft="10dip" 
    android:textColor="#ff000000" 
    android:layout_centerVertical="true"
    android:gravity="center_vertical"
    android:layout_alignBottom="@+id/principal_li_icone"
    android:layout_toRightOf="@+id/principal_li_icone"/>

谢谢

【讨论】:

以上是关于自定义ListView的RelativeLayout中的Android布局居中的主要内容,如果未能解决你的问题,请参考以下文章

ListView 中的自定义复选框

自定义ListView

Android:自定义 ListView 不会立即填充

自定义 ListView 重复一行

为自定义 Listview 添加搜索到自定义 SimpleAdapter

ListView 中自定义 ArrayAdapter 的自定义过滤