【问题标题】:AbsListView LayoutParams Set Layout GravityAbsListView LayoutParams 设置布局重力
【发布时间】:2013-06-25 08:52:22
【问题描述】:

如何设置 AbsListView.LayoutParams 的布局重力?

我在自定义数组适配器中使用它,我需要根据变量设置布局重力。我的列表子项包含一个线性布局根,但在适配器中,我无法设置 LinearLayout 参数,因为我收到 LinearLayout.LayoutParams 无法转换为 AbsListView.Layout 参数的错误。

所以,我尝试为 AbsListView 设置 layout_gravity,但它没有重力选项。

在这种情况下如何以编程方式设置 layout_gravity?

编辑:(添加源代码)

Listview 父级

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/messaging_background"
    android:orientation="vertical"
    android:padding="2dp" >

    <ListView
        android:id="@+id/messageThread"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/list_separator"
        android:layout_alignParentTop="true"
        android:layout_marginTop="5dp"
        android:cacheColorHint="#00000000"
        android:divider="@null"
        android:dividerHeight="2dp"
        android:fastScrollEnabled="false"
        android:listSelector="#00000000"
        android:transcriptMode="disabled" />

    <View
        android:id="@+id/list_separator"
        android:layout_width="match_parent"
        android:layout_height="1.0dip"
        android:layout_above="@+id/footer"
        android:background="@android:color/white" />

    <LinearLayout
        android:id="@+id/footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <ImageButton
            android:id="@+id/filter"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="0.1"
            android:background="@null"
            android:contentDescription="@string/message_filter_button"
            android:scaleType="fitCenter"
            android:src="@drawable/filter" />

        <EditText
            android:id="@+id/send_message_text"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.8"
            android:imeOptions="actionSend"
            android:inputType="textMultiLine"
            android:maxLines="6"
            android:scrollbarAlwaysDrawVerticalTrack="true"
            android:scrollbarDefaultDelayBeforeFade="200"
            android:scrollbarFadeDuration="300"
            android:scrollbarStyle="outsideOverlay"
            android:scrollbars="vertical" />

        <ImageButton
            android:id="@+id/send"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="0.1"
            android:background="@null"
            android:contentDescription="@string/send_message_button"
            android:scaleType="fitCenter"
            android:src="@drawable/send_btn" />
    </LinearLayout>

</RelativeLayout>

Listview 孩子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="@drawable/incoming"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/messaging_bubble_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:fontFamily="sans-serif-light"
        android:maxWidth="200dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textIsSelectable="true" />

    <TextView
        android:id="@+id/messaging_bubble_time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:fontFamily="sans-serif-light"
        android:gravity="center"
        android:paddingRight="5dp"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textIsSelectable="false" />

    <ImageView
        android:id="@+id/messaging_bubble_megaphone"
        android:layout_width="20dp"
        android:layout_height="match_parent"
        android:contentDescription="@string/message_child_megaphone"
        android:src="@drawable/megaphone"
        android:visibility="gone" />

</LinearLayout>

我应该在我的适配器的getView中调用什么来根据适配器中的一个变量将孩子推到右边?

编辑 2:

一个可能的解决方案: 将整个子元素包裹在根下的另一个元素下,然后您可以设置重力而不是布局重力,这可以使用setGravity() 方法轻松完成。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/messaging_bubble_wrapper"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@drawable/incoming"
        android:orientation="vertical"
        tools:ignore="UselessParent" >

第二个线性布局没用,但它可以完成工作!

【问题讨论】:

  • 您可以将现有的行布局包装在另一个布局中(例如FrameLayout),然后简单地从FrameLayout 设置Linearlayout 的重力。但是,如果您尝试制作某种消息列表,例如行,我建议您创建一个包含两种类型行的适配器。
  • 这正是我最终要做的。看起来很老套,但它是我能找到的最简单的解决方案。
  • 这不是那么 hacky,因为 LayoutParamsAdapterViews 不允许重力(因为孩子由小部件本身管理)。
  • 好的,有道理。来自 Eclipse 的“无用父母”警告让我觉得它有点 hacky。哈哈。无论如何,谢谢你。
  • 这只是一个警告,因为 Eclipse 不知道/看到您将在代码中使用该布局。您可以通过在行布局中使用 RelativeLayout 而不是父 LinearLayout 来改进这一点,并相应地移动子代。

标签: android layout gravity layoutparams


【解决方案1】:

要更改重力,您可以将现有的行布局包装在另一个布局中(例如FrameLayout),然后从该额外布局(现在可以在父布局内​​移动)简单地在LinearLayout 上设置重力。

为避免在布局中添加额外级别,您可以保留当前行布局并将根 LinearLayout 替换为 RelativeLayout 并根据您所需的重力更改其中的视图位置。

【讨论】:

    【解决方案2】:

    我通过在我的根元素下创建另一个“无用视图(用 Eclipse 的话)”解决了这个问题。

    我将父级的宽度设置为 match_parent,然后更改重力以向左或向右移动“无用视图”。在AbsListView 上允许使用setGravity(Gravity.LEFT) 方法。

    【讨论】:

      【解决方案3】:

      我认为您需要摆脱 ListView。将 ListView 替换为 FrameLayout 并使用 layoutinflater 将“listview”子项添加到 FrameLayout 中。使用 layoutinflater 时,将 FrameLayout.LayoutParams 的重力属性分配给子节点的根 (LinearLayout)。祝你好运。

      【讨论】:

      • 这可以让我使用列表适配器吗?
      • 这是个坏主意。 listview的recycler对于内存和性能非常重要。不,您将无法使用适配器。
      【解决方案4】:

      你可以用setGravity()设置孩子内容的重力:

      View child;
      boolean left;
      
      child.setGravity(left ? Gravity.LEFT : Gravity.RIGHT);
      

      而且孩子应该改成android:layout_width="match_parent"

      【讨论】:

      • 这与布局重力的效果不同。布局将取决于孩子的直接父级的宽度和高度(可能与布局的父级的宽度和高度不同)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多