RelativeLayout的增加规则“RelativeLayout.LEFT_OF”不工作(Rel

2019-06-24 16:30发布

我有象下面这样的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代码中,我想一个视图添加到列表视图的左侧,但它并没有奏效:

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的bug或我失去了一些东西?

我总是试图addView(View child, int index, LayoutParams params)但它可能只是在LinearLayout中工作。 那么,有没有一个正常的解决方案,使RelativeLayout.LEFT_OF工作?

编辑

我曾尝试RelativeLayout.BELOWRelativeLayout.RIGHT_OF ,他们的工作完美,所以这意味着我没有足够的地方,以获得该按钮? 我试着给更多的空间,但它仍然无法正常工作。

我用东芝AT100(1280 * 800)和景观,因此空间够。 测试belowright正好相同left 。 我想如果我把一个控制一个在RelativeLayout的,那么我想补充控制B和decalare它是在控件的左边,结果应该是控制B将控制一推,它的权利,对不对?

Answer 1:

我想如果我把一个控制一个在RelativeLayout的,然后我加控制B和宣布它是在控件的左边,结果应该是控制B将控制一推,它的权利,对不对?

你的假设是不正确的,除非你指定该用控制A将不会被推向右侧RelativeLayout.LayoutParams规则。 RelativeLayout放置其孩子彼此开始在屏幕的左上角的一个一个顶部,如果你不为他们指定放置规则。 当您添加View A到RelativeLayout ,没有任何的规则(比如layout_alignParentRight ),它会被放置在屏幕的左上角开始。 然后,当您添加View B,规则to_leftOf将适用于该View的位置,但这个规则并不意味着对任何View阿谁将会保持其在屏幕上的位置。 这将使View B到是地方的左View A,但屏幕的外面View一个范围从屏幕的左边框启动。

Button将被放置在左边ListView当您使用layout_alignParentRight="true" ,因为现在还有空间,实际看到的Button (这不是外面了)。 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将它移动到右侧(从上面的代码的最后两行)。



Answer 2:

如果您的变量名是指示性的,那是因为你要添加的窗口小部件,LinearLayout中,所以对于一个RelativeLayout的标签被忽略。

这条线路是我在谈论的一个:

m_linearLayout.addView(button2, layoutParams);

编辑

你说alignParentRight作品...唯一的区别还有就是OT不走锚参数。 也许m_listView.getId()没有返回正确的ID。 你可以使用调试器逐步完成,看看它返回一个适当的值。

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

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


Answer 3:

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

<item name="imageViewID" type="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());


Answer 4:

我想你可能忘记添加m_listViewRelativeLayoutm_listView的知名度将GONE

能否请您检查是什么?



Answer 5:

SETID之前校准被调用,特别是对新的对象视图。



Answer 6:

如果您使用的是自定义的ID,而不是一个普通的Android产生的ID(例如, R.id.my_id ),确保该ID不等于0(或负),否则该规则将被忽略。



文章来源: RelativeLayout add rule “RelativeLayout.LEFT_OF” not working