17

我有一个如下的relativeLayout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:id="@+id/parent" >

    <ListView 
        android:layout_width="360dp"
        android:layout_height="600dp"
        android:id="@+id/list"
        android:inputType="text"
        android:maxLines="1"
        android:layout_margin="50dp"
        android:layout_alignParentRight="true"
        />
</RelativeLayout>

在java代码中,我想在listview的左侧添加一个视图,但是没有用:

m_relativeLayout = (RelativeLayout)findViewById(R.id.parent);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId());
Button button2 = new Button(this);
button2.setText("I am button 2");
m_relativeLayout.addView(button2, layoutParams);

只有当我将列表视图设置为alignParentRight时,它才会起作用。这是一个android错误还是我错过了什么?

我总是尝试addView(View child, int index, LayoutParams params),但它可能只适用于线性布局。那么有没有正常的解决方案来完成这项RelativeLayout.LEFT_OF工作?

编辑

我已经尝试过RelativeLayout.BELOWand RelativeLayout.RIGHT_OF,并且它们工作得很好,所以这意味着我没有足够的地方来获取按钮?我试图给更多的空间,但它仍然不起作用。

我用的是东芝AT100(1280*800)和风景,所以空间够用。测试belowright一样left。我想如果我将控件 A 放在相对布局中,然后我添加控件 B 并将其标记在控件 A 的左侧,结果应该是控件 B 将控件 A 推到其右侧,对吗?

4

6 回答 6

24

我想如果我将控件 A 放在相对布局中,然后我添加控件 B 并声明它在控件 A 的左侧,结果应该是控件 B 将控件 A 推到其右侧,对吗?

RelativeLayout.LayoutParams您的假设不正确,除非您使用规则指定,否则控件 A 不会被向右推。RelativeLayout如果您没有为它们指定放置规则,则从屏幕的左上角开始将其子项彼此一层一层地放置。当您将ViewA 添加到RelativeLayout没有任何规则(如layout_alignParentRight)的情况下,它将从屏幕的左上角开始放置。然后,当您添加ViewB 时,该规则to_leftOf将适用于该位置,但该规则对于将保持其在屏幕上的位置View的 A 没有任何意义。View这将使ViewB 位于ViewA 的左侧但在屏幕之外,因为ViewA 的边界从屏幕的左边框开始。

Button放置ListView在您使用时的左侧,layout_alignParentRight="true"因为现在有空间可以实际看到Button(不再在外面了)。addView(View child, int index, LayoutParams params)在 a 中工作是LinearLayout因为它会将LinearLayout其子项排列在一行或一列中(取决于方向),因此当您View在特定位置添加 a 时,它将Views在它之后将另一个推到右侧或下方(取决于方向)(没有相对a 中的视图定位LinearLayout,唯一的规则是孩子们一个接一个地来)。

ListView没有设置任何规则的 开始,这里有一个示例,说明如何使Button出现在 的左侧ListView

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
Button button2 = new Button(this);
button2.setText("I am button 2");
button2.setId(1000);
m_relativeLayout.addView(button2, layoutParams);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView
            .getLayoutParams();
rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId());

Button 将正常添加到屏幕上,并且从屏幕的左上角开始出现。如果没有上面代码中的两行,Buttonand将重叠,因为这是没有任何规则的孩子ListView的正常行为。RelativeLayout然后我们显式地修改 的位置ListView以将其移动到右侧(上面代码的最后两行)。

于 2012-05-22T14:26:18.217 回答
3

如果您的变量名称是指示性的,那是因为您将小部件添加到 LinearLayout,因此 RelativeLayout 的标签被忽略。

这条线就是我所说的:

m_linearLayout.addView(button2, layoutParams);

编辑

你说alignParentRight工作......唯一的区别是 ot 不采用锚参数。也许m_listView.getId()没有返回正确的 ID。您可以逐步使用调试器,看看它是否返回了正确的值。

也许您可以尝试专门调用 id ...

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
于 2012-05-22T11:42:57.023 回答
3

要执行它,请使用预定义的视图ID或声明一个。在values 文件夹中创建ids.xml然后添加一个像这样的项目

<item name="imageViewID" type="id"/>

在您创建新视图实例的代码中使用此 ID,如下所示:

RelativeLayout layout=new RelativeLayout(context);

ImageView imageView = new ImageView(context);
imageView.setId(R.id.imageViewID);

RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(imageView, layoutParams);

TextView  textView = new TextView(context);

RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
textViewParams.addRule(RelativeLayout.BELOW, imageView.getId());
layout.addView(nameView, nameLayoutParams);

或者我们可以直接使用这个函数View.generateViewId()来执行相同的操作。像这样:

imageView.setId(View.generateViewId());
于 2016-05-24T15:13:41.610 回答
1

setId 在 align 被调用之前,特别是对于新的对象视图。

于 2013-12-12T03:23:46.180 回答
1

我想你可能已经忘记添加or的可见性m_listView了。RelativeLayoutm_listViewGONE

你能检查一下吗?

于 2012-05-22T11:24:21.403 回答
0

如果您使用的是自定义 id 而不是常规生成的 Android id(例如R.id.my_id),请确保 id 不等于 0(或负数),否则该规则将被忽略。

于 2016-04-12T12:59:57.673 回答