RelativeLayout添加规则“RelativeLayout.LEFT_OF”不起作用

时间:2012-05-22 10:31:43

标签: android android-layout android-relativelayout

我有一个像下面这样的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);

只有将listview设置为 alignParentRight ,才有效。这是一个机器人的bug还是我错过了什么?

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

修改

我已经尝试了RelativeLayout.BELOWRelativeLayout.RIGHT_OF,他们工作得很好,所以这意味着我没有足够的位置来获取按钮?我试图给予更多空间,但它仍然不起作用。

我使用东芝AT100(1280 * 800)和风景,所以空间足够。测试belowrightleft相同。我想如果我把一个控件A放在relativelayout中,那么我在控件A的左边添加控件B并将其转换成结果,结果应该是控件B将控件A推到右边,对吧?

6 个答案:

答案 0 :(得分:23)

  

我认为如果我将控件A放在relativelayout中,那么我添加控件B并在控件A的左侧声明它,结果应该是控件B将控件A推到右边, 对?

您的假设不正确,除非您使用RelativeLayout.LayoutParams规则指定,否则控件A不会被推到右侧。 RelativeLayout如果您没有为其指定展示位置规则,则会从屏幕的左上角开始将其子项放在彼此的顶部。当您将View A添加到RelativeLayout而没有任何规则(例如layout_alignParentRight)时,它将从屏幕的左上角开始放置。然后,当您添加View B时,规则to_leftOf将适用于此View位置,但此规则对View A的任何内容都没有任何意义保持其在屏幕上的位置。这将使View B位于View A的左侧,但在屏幕外,View边界从屏幕的左边框开始。

当您使用Button时,ListView将放置在layout_alignParentRight="true"的左侧,因为现在有空间可以实际看到Button(它是&#39; s不在外面)。 addView(View child, int index, LayoutParams params)适用于LinearLayout,因为LinearLayout会将其子项排成行或列(取决于方向),因此当您在特定位置添加View时,它将会将另一个Views推到右侧或下方(取决于方向)(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());

按钮将正常添加到屏幕上,它将从屏幕的左上角开始显示。如果没有上面代码中的两行,则ButtonListView会重叠,因为这是RelativeLayout对于没有任何规则的儿童的正常行为。然后我们明确地修改ListView的位置以将其移动到右侧(使用上面代码中的最后两行)。

答案 1 :(得分:3)

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

这条线是我正在谈论的那条:

m_linearLayout.addView(button2, layoutParams);

修改

你说alignParentRight有效...唯一的区别是ot没有采用锚参数。也许m_listView.getId()没有返回正确的id。您可以单步执行调试器,看看它是否返回了正确的值。

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

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);

答案 2 :(得分:3)

要执行此操作,请使用预定义视图 ID 或声明一个。在值文件夹中创建 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());

答案 3 :(得分:1)

我认为您可能忘记将m_listView添加到RelativeLayoutm_listView的可见性为GONE

请你检查一下吗?

答案 4 :(得分:1)

调用align之前的

setId,尤其是对于新的对象视图。

答案 5 :(得分:0)

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