如何以编程方式设置layout_gravity?

Ada*_*gyi 309 android android-layout

我的问题很简单,

如何以编程方式设置我的按钮layout_gravity?

我在互联网上发现了这个,但它只是抛出了一个Nullpointer异常:

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);
Run Code Online (Sandbox Code Playgroud)

有解决方案吗

Kar*_*thi 518

Java的

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

科特林

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}
Run Code Online (Sandbox Code Playgroud)

对于重力值以及如何设置重力检查重力.

基本上,您应该LayoutParams根据父母选择.它可以是RelativeLayout,LinearLayout等...

  • 从文档中获取常量值是完全错误的,请使用Gravity.TOP (51认同)
  • 这是"引力",他要求"layout_gravity"? (31认同)
  • @usman不,这是关于`layout_gravity`(即'LayoutParams.gravity`).`gravity`将是`button.setGravity()` (9认同)
  • 在SO上有关于引力和layout_gravity的大量错误信息.许多人认为`setGravity()`是layout_gravity,但这是错误的.我可以批准这个答案对于以编程方式设置layout_gravity是正确的. (7认同)

Ukn*_*ght 53

我不想复活旧线程,但这是一个无法正确回答的问题,而且我自己遇到了这个问题.

这里有点长,如果你只对答案感兴趣,请一直向下滚动到代码:

android:gravity和android:layout_gravity的工作方式不同.是我读过的一篇帮助我的文章.

文章的GIST:重力影响高度/宽度分配后的视图.因此,重心不会影响完成FILL_PARENT的视图(将其视为自动边距).layout_gravity center将影响FILL_PARENT视图(将其视为自动填充).

基本上,android:layout_gravity不能以编程方式访问,只有android:gravity.在OP的情况和我的情况下,接受的答案不会将按钮垂直居中.

改进Karthi的答案:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

链接LinearLayout.LayoutParams.

android:layout_gravity显示"无相关方法"意思无法以编程方式访问.而重力是班上的一个领域.


Yas*_*mar 23

MyButton.setGravity(Gravity.RIGHT);
Run Code Online (Sandbox Code Playgroud)

对于layout_gravity,请使用"karthi"所述的答案.此方法设置重力以将子项放在视图中.

  • 它只是引力,而不是layout_gravity. (34认同)
  • 发布庞大的文档不是解决方案抱歉, (5认同)

小智 17

我在GridLayout中按钮上以编程方式设置layout_gravity时遇到了类似的问题.

诀窍是在按钮被添加到父(GridLayout)之后在按钮layoutParams上设置重力,否则将忽略重力.

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
Run Code Online (Sandbox Code Playgroud)


vov*_*ost 11

如果要更改layou_gravity现有视图,请执行以下操作:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;
Run Code Online (Sandbox Code Playgroud)

请记住LayoutParams根据视图所在的布局类型使用权限.例如:

LinearLayout.LayoutParams
Run Code Online (Sandbox Code Playgroud)


小智 11

layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;
Run Code Online (Sandbox Code Playgroud)

使用它来添加mor而不是一个引力

  • 不,就是这样:`gravity = Gravity.END or Gravity.BOTTOM` (3认同)
  • @OleksandrNos你写的是Kotlin语法,Omar写的是java语法。 (3认同)

Hit*_*ahu 9

KOTLIN 在 FrameLayout 上设置多个重力而不改变大小:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()
Run Code Online (Sandbox Code Playgroud)


Cod*_*kes 8

这个问题很老,但我遇到了同样的问题并且像这样解决了

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
Run Code Online (Sandbox Code Playgroud)


Che*_*eng 5

如果你想把一个视图放在父母的中心,你可以用下面的代码做..

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}
Run Code Online (Sandbox Code Playgroud)

这些代码部分使 LinearLayout 将第一个视图元素放在父元素的中心。所以,我们系统不考虑初始宽度和高度在中心排列视图。我的代码部分做得很好。


小智 5

我使用类似的东西:(Xamarin 和 C# 代码)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 
Run Code Online (Sandbox Code Playgroud)

SetGravity 将我的 textView 放在布局的中心。所以SetGravity布局属性指的是布局内容


use*_*311 5

如果您需要为视图设置重力,请使用以下内容

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);
Run Code Online (Sandbox Code Playgroud)

要为 Button 设置 layout_gravity,请为 layoutparams 使用重力场作为

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;
Run Code Online (Sandbox Code Playgroud)

试试这个希望这会清除谢谢