我可以在运行时以编程方式设置"android:layout_below"吗?

Ala*_*anH 194 android android-layout android-relativelayout

是否可以在运行时创建RelativeLayout来以android:layout_below编程方式设置等效项?

Ric*_*ler 447

是:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

首先,代码通过指定高度和宽度来创建新的布局参数.该addRule方法适当地添加了等效的xml android:layout_below.然后你只需要调用View#setLayoutParams你想拥有这些参数的视图.

  • 为什么不能接受这个答案?这是一个非常好的解释. (11认同)

jac*_*ode 139

或者,您可以使用视图当前布局参数并修改它们:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);
Run Code Online (Sandbox Code Playgroud)

  • @EelLee这显然是回答这个问题的另一种方式,这就是为什么它有11个赞成. (14认同)
  • 这应该有比其他答案更多的赞成:为了保持视图的一致行为,我们应该使用现有的`LayoutParams`而不是创建新的.事实上,这应该被接受为正确的答案. (7认同)

Coo*_*ind 7

虽然@jackofallcode答案是正确的,但它可以写成一行:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);
Run Code Online (Sandbox Code Playgroud)


Mah*_*oud 5

具有中缀功能的Kotlin版本

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

view1 below view2
Run Code Online (Sandbox Code Playgroud)

或者您可以将其作为普通函数调用:

view1.below(view2)
Run Code Online (Sandbox Code Playgroud)