如何以编程方式设置layout_gravity?

时间:2011-11-08 11:23:30

标签: 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);

任何解决方案?

20 个答案:

答案 0 :(得分:495)

爪哇

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

button.setLayoutParams(params);

科特林

val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
            params.weight = 1.0f
            params.gravity = Gravity.TOP

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

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

答案 1 :(得分:51)

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

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

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

文章的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);

LinkLinearLayout.LayoutParams

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

答案 2 :(得分:22)

MyButton.setGravity(Gravity.RIGHT);

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

答案 3 :(得分:17)

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

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

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

答案 4 :(得分:10)

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

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

请记住根据视图所在的布局类型使用正确的LayoutParams。例如:

LinearLayout.LayoutParams

答案 5 :(得分:9)

layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

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

答案 6 :(得分:8)

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

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

答案 7 :(得分:4)

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()

答案 8 :(得分:4)

我使用这样的东西:( Xamarin和C#代码)

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

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

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

答案 9 :(得分:3)

其余答案是对的,我想补充更多解释。 layout_gravity是关于如何在父视图中定位视图。

在调用方法parentView.addView()**之后,必须设置重力**。我们可以看到代码:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

空指针的问题是因为它没有在getLayoutParams()之前调用addView。

注释已经说过“如果此View未附加到父ViewGroup,或者@@ link#setLayoutParams(android.view.ViewGroup.LayoutParams)}未成功调用,则此方法可能返回null。附加视图时对于父ViewGroup,此方法不能返回null。“

答案 10 :(得分:3)

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

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

用于设置Button的layout_gravity 使用gravityparams的重力场作为

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

试试这个 希望这清楚 感谢

答案 11 :(得分:2)

到RelativeLayout,尝试这段代码,它对我有用: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

答案 12 :(得分:2)

完美的工作!!! 上述答案都不适合我。在Xml文件中设置重力和设置layout_gravity是不同的。查看以下代码

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

同时检查 This,where you can find clear explanation about gravity and layout_gravity .

答案 13 :(得分:2)

如果您想将视图放在父级的中心,可以使用以下代码。

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);
  }
}

这些代码部分使LinearLayout将第一个视图元素放在父级的中心。 因此,我们系统不考虑初始宽度和高度来排列中心的视图。 我很好地完成了代码部分。

答案 14 :(得分:0)

我从LinearLayout.LayoutParams切换到RelativeLayout.LayoutParams,最终得到我在我创建的自定义圈视图上所需的结果。

但是使用addRule

而不是引力

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams(circleheight,circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

答案 15 :(得分:0)

试试此代码

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

    btn.setGravity(Gravity.TOP);

答案 16 :(得分:0)

 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);

答案 17 :(得分:0)

上面的大多数答案都是正确的,因此编写了 helper方法,以便您可以使用它 直接在您的项目中。

  通过编程

设置 layout_gravity

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }

答案 18 :(得分:0)

修改现有布局参数并重新设置布局参数

//Get the current layout params and update the Gravity
(iv.layoutParams as FrameLayout.LayoutParams).gravity = Gravity.START
//Set layout params again (this updates the view)
iv.layoutParams = layoutParams

答案 19 :(得分:-1)

undefined['fish-ly']