如何以编程方式设置layout_gravity?


333

我的问题很简单,

如何以编程方式设置按钮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);

有什么办法吗?


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

Answers:


544

爪哇

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等等。


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

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

35
这是“重力”,他要求“ layout_gravity”?
M. Usman Khan

10
@usman不,这是关于layout_gravity(即LayoutParams.gravity)。那gravity将是button.setGravity()
Floern '16

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

55

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

这很长,如果您仅对答案感兴趣,请一直向下滚动到代码:

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

链接LinearLayout.LayoutParams

android:layout_gravity显示“无相关方法”,意味着无法以编程方式进行访问。而重力是课堂上的一个领域。


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

21
MyButton.setGravity(Gravity.RIGHT);

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


37
它只是重力,而不是layout_gravity。
亚当·瓦赫吉

好吧,然后告诉我,如果layout_gravity等于setGravity,那么我如何设置重力?
亚当·瓦赫吉


5
发布一个巨大的文件并非溶液抱歉,
亚当Varhegyi

寻找在链接setGravity方法..,不知何故重定向到精确的方法是行不通的..
Yashwanth库马尔

17

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

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

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

如何更改整个GridLayout的layout_gravity?
伊克巴尔州

15

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

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

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

LinearLayout.LayoutParams


9

这个问题很旧,但我只是遇到了同样的问题,就这样解决了

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

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

这是否仅通过指定首先使用哪种布局才能起作用?像RelativeLayout.LayoutParams一样,而不只是LayoutParams
ryvianstyron 2012年

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

6

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


多谢兄弟!节省我的时间2 ...
YH_WU

4

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

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

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

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


4

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

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

要为Button设置layout_gravity,请将layoutparams的gravity字段设置为

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

尝试这个希望这可以清除感谢


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。

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


这也让我有点...在调用addView()之后,必须设置重力并不明显。您可能会认为
已将

3

如果要将视图放在父对象的中心,则可以使用以下代码。

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将第一个视图元素放在父对象的中心。因此,我们系统不考虑初始宽度和高度来将视图排列在中心。我的代码部分做得很好。


i-斜体))))
Artem

2

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


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

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


1

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

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

0

我从LinearLayout.LayoutParams切换到RelativeLayout.LayoutParams,最终在我创建的自定义Circleview上获得了想要的结果。

但是您可以使用addRule代替重力

RelativeLayout.LayoutParams mCircleParams =新的RelativeLayout.LayoutParams(circleheight,circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


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

-1
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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.