我的问题很简单,

如何以编程方式设置我的按钮layout_gravity? />
 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);


任何解决方案?

评论

我相信您需要先将视图添加到其父视图,然后该视图的LayoutParams才会为null。

#1 楼

Java

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
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}


有关重力值以及如何设置重力的信息,请检查重力。

基本上,应根据父级选择LayoutParams。可以是RelativeLayoutLinearLayout等...

评论


由于某些原因,params.gravity = 80(应为Docs,应该是BOTTOM)无法正常工作。在“视图”和“文本”的底部之间有一些空间。它不是底部对齐...

–亚当·瓦赫吉(Adam Varhegyi)
2011-11-10 13:09

从文档中获取常量值是完全错误的,请使用Gravity.TOP

– Maragues
2012年9月22日上午11:02

这是“重力”,他要求“ layout_gravity”?

–乌斯曼·汗(M. Usman Khan)
16 Mar 4 '16 at 14:02

@usman不,这是关于layout_gravity(即LayoutParams.gravity)。重力将为button.setGravity()

–地板
16年11月23日在17:06

在SO上,关于重力和layout_gravity的信息有很多错误。许多人认为setGravity()是layout_gravity,但这是错误的。我可以同意此答案对于以编程方式设置layout_gravity是正确的。

–好吧
16年11月28日在9:36

#2 楼

我不希望恢复旧线程,但这是一个无法正确回答的问题,而且我本人也遇到了该问题。答案请一直向下滚动至代码:

android:gravity和android:layout_gravity的工作方式不同。这是我读过的对我有帮助的文章。

文章的GIST:分配高度/宽度后,重力会影响视图。因此,重心将不会影响完成FILL_PARENT的视图(将其视为自动边距)。 layout_gravity中心将影响为FILL_PARENT的视图(将其视为自动填充)。情况下,可接受的答案不会使按钮垂直居中。

要改善Karthi的答案,请按以下步骤操作:

/>
android:layout_gravity显示“没有相关方法”的含义不能以编程方式访问。
重力是类中的一个字段。

评论


还要添加基于LinearLayout父级方向的重力自动边距(由于缺少更好的用语)。提供的文章链接会有所帮助。

–骑士
2012年11月12日上午10:25

#3 楼

MyButton.setGravity(Gravity.RIGHT);


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

评论


它只是重力,而不是layout_gravity。

–亚当·瓦赫吉(Adam Varhegyi)
2011年11月8日,11:27

好吧,然后告诉我,如果layout_gravity等于setGravity,那么如何设置重力?

–亚当·瓦赫吉(Adam Varhegyi)
2011年11月8日,11:30

developer.android.com/reference/android/widget/…,看看这个。

– Yaswanth Kumar
2011年11月8日,11:31

对不起,发布巨大的文档不是解决方案,

–亚当·瓦赫吉(Adam Varhegyi)
2011年11月8日,11:59

在链接中查找setGravity方法。某种程度上,重定向到确切方法的方法不起作用。

– Yaswanth Kumar
2011年11月8日12:03

#4 楼

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

诀窍是在按钮布局上设置重力,然后将按钮添加到父级(GridLayout),否则会忽略重力。

评论


如何更改整个GridLayout的layout_gravity?

–伊克巴尔
16年2月8日在12:48

2020年仍然如此!为什么?

–托马斯
20-10-31在20:55

#5 楼

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


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


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

LinearLayout.LayoutParams


#6 楼

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


使用它添加多个重力

评论


不,这是这样的:引力= Gravity.END或Gravity.BOTTOM

–夹竹桃
20-10-8在15:39

#7 楼

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

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


评论


@Muzikant ..好的..我没有首先注意到..但是现在对我来说很清楚..谢谢

–诺曼
2012年7月18日在9:51

这仅通过指定首先使用哪种布局才能起作用吗?像RelativeLayout.LayoutParams ...而不是LayoutParams

–shecodesthings
2012年10月31日18:48



RelativeLayout.LayoutParams使用其他标志来设置视图的重力(rightOf,centerInParent,centerVertical)。此解决方法适用于LinearLayouts儿童

– Noni
2013年9月24日20:41在

#8 楼

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


评论


节省我的时间... THX

– BertKing
19年3月1日在7:08

#9 楼

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

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

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


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

#10 楼

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

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


为Button设置layout_gravity
,将layoutparams的重力字段用作>
LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;


试试这个
希望清除它
感谢

#11 楼

其余的答案是正确的,我想添加更多的解释。 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。

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

评论


这也让我有点...在调用addView()之后不必设置重力。您可能会认为要在新视图上设置所有内容,然后添加它,所以这是不直观的:-P

– Kenyee
16年8月14日在3:23

#12 楼

如果要将视图放置在父视图的中心,则可以使用以下代码。
因此,我们系统不考虑初始宽度和高度来将视图安排在中心。
我很好地完成了代码部分。

评论


我-斜体))))

– Artem
17年4月12日在13:24

#13 楼

到RelativeLayout,请尝试以下代码,该代码对我有用:
yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

#14 楼

完美地工作!!!以上答案均不适合我。在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);


还要检查此内容,在这里您可以找到有关引力和layout_gravity的清晰说明。

#15 楼

上面的大多数答案都是正确的,所以写了一个辅助方法,这样您就可以直接在项目中使用它了。
// 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;
    }


#16 楼

我从LinearLayout.LayoutParams切换到RelativeLayout.LayoutParams终于在我创建的自定义圆环视图上获得了我想要的结果。 LayoutParams mCircleParams =新的RelativeLayout.LayoutParams(circleheight,circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


#17 楼

试试此代码

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




    btn.setGravity(Gravity.TOP);


评论


OP要求的不是layout_gravity重力。

– alizeyn
18年7月1日在12:04

#18 楼

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


#19 楼

FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);