我试图实现以下编程方式(而不是通过XML声明):

<RelativeLayout...>
   <TextView ...
      android:id="@+id/label1" />
   <TextView ...
      android:id="@+id/label2"
      android:layout_below: "@id/label1" />
</RelativeLayout>

换句话说,我如何使第二个TextView出现在第一个下面,但我想在代码中这样做:

RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);

更新:

谢谢,TreeUK。我理解大致的方向,但还是不行——B和A重叠。我做错了什么?

RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");

TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());

layout.addView(tv1);        
layout.addView(tv2, lp);

当前回答

根据我所能够拼凑的内容,您必须使用LayoutParams添加视图。

LinearLayout linearLayout = new LinearLayout(this);

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

parentView.addView(linearLayout, relativeParams);

所有功劳都归功于sechastain,以编程方式相对定位您的项目,您必须为它们分配id。

TextView tv1 = new TextView(this);
tv1.setId(1);
TextView tv2 = new TextView(this);
tv2.setId(2);

然后addRule(使用。RIGHT_OF tv1.getId ());

其他回答

根据我所能够拼凑的内容,您必须使用LayoutParams添加视图。

LinearLayout linearLayout = new LinearLayout(this);

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

parentView.addView(linearLayout, relativeParams);

所有功劳都归功于sechastain,以编程方式相对定位您的项目,您必须为它们分配id。

TextView tv1 = new TextView(this);
tv1.setId(1);
TextView tv2 = new TextView(this);
tv2.setId(2);

然后addRule(使用。RIGHT_OF tv1.getId ());

调用

tv1.setId(1) 

tv1.setText("A");

长话短说: 使用相对布局可以在布局中放置元素。

创建一个新的RelativeLayout。LayoutParams RelativeLayout。LayoutParams lp = new RelativeLayout.LayoutParams(…) (不管…填充父内容或包装内容,绝对数字(如果你必须,或引用XML资源) 添加规则: 规则指的是父级或层次结构中的其他“兄弟”。 lp.addRule(使用。下面,someOtherView.getId ()) lp.addRule (RelativeLayout.ALIGN_PARENT_LEFT) 应用布局参数:最“健康”的方法是: parentLayout。addView (myView lp)

注意:不要从布局回调中更改布局。这样做很有诱惑力,因为这是视图获得实际大小的时候。然而,在这种情况下,预期会出现意想不到的结果。

我花了4个小时来解决这个问题。终于意识到你不能使用0作为视图id。你可能认为NO_ID == -1是允许的,但是如果你把它给你的视图,事情就会变得混乱…

ViewGroup的这种方法。MarginLayoutParams为我工作:

RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.my_layout);

TextView someTextView = ...

int leftMargin = Util.getXPos();
int topMargin = Util.getYPos();

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
    new ViewGroup.MarginLayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT));

lp.setMargins(leftMargin, topMargin, 0, 0);

myLayout.addView(someTextView, lp);