我试图以编程方式实现以下(而不是通过XML声明):
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
换句话说,如何使第二个 TextView
出现在第一个 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);
9 回答
从我能够拼凑到一起,您必须使用LayoutParams添加视图 .
所有归功于sechastain,以编程方式相对定位您的项目您必须为他们分配ID .
然后
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
简而言之:通过相对布局,您可以在布局中定位元素 .
(无论如何......填充父级或包装内容,绝对数字,如果必须,或引用XML资源)
Watch out :不要从布局回调中更改布局 . 这样做很诱人,因为这是视图获得实际尺寸的时候 . 但是,在这种情况下,预计会出现意外结果 .
刚刚花了4个小时解决这个问题 . 终于意识到你 must not use zero as view id . 你会认为它被允许为NO_ID == -1,但如果你把它放到你的视野中,事情往往会变得混乱......
Android 22 minimal runnable example
资源:
使用
android create project ...
生成的默认项目 . GitHub repository with minimal build code .呼叫
后
尝试:
ViewGroup.MarginLayoutParams的这种方法对我有用:
如果你真的想手动布局,我建议根本不要使用标准布局 . 自己动手做,这里有一个kotlin例子:
这可能会让您了解这是如何工作的