【问题标题】:How to set layout_gravity programmatically?如何以编程方式设置 layout_gravity?
【发布时间】:2011-12-24 09:04:30
【问题描述】:

我的问题很简单,

如何以编程方式设置我的按钮 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。

标签: android android-layout


【解决方案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
}

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

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

【讨论】:

  • 由于某些原因 params.gravity = 80 (它应该是 BOTTOM,由 te Docs 提供)只是不起作用。我在视图底部和文本之间有一些空间。它不是那么底部对齐...
  • 从文档中获取常量值是完全错误的,请使用 Gravity.TOP
  • 这是“重力”,他要求“layout_gravity”??
  • @usman 不,这是关于layout_gravity(即LayoutParams.gravity)。 gravity 将是 button.setGravity()
  • 在 SO 上有很多关于重力和 layout_gravity 的错误信息。许多人认为setGravity() 是layout_gravity,但这是错误的。我可以同意这个答案对于以编程方式设置 layout_gravity 是正确的。
【解决方案2】:

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

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

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

文章要点:在指定高度/宽度后,重力会影响视图。因此重心不会影响完成 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 显示“无相关方法”表示无法以编程方式访问。 而重力是类中的一个领域。

【讨论】:

  • 还根据 LinearLayout 父级的方向添加重力自动边距(因为缺少更好的术语)。提供的文章链接会有所帮助。
【解决方案3】:

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

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

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

【讨论】:

  • 如何更改整个 GridLayout 的 layout_gravity?
  • 2020 年依然如此!为什么?
  • 非常感谢。 2021 年仍然如此(顺便说一句,接近 2022 年)
【解决方案4】:
MyButton.setGravity(Gravity.RIGHT);

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

【讨论】:

  • 它只是重力,而不是 layout_gravity。
  • 好的,那么告诉我layout_gravity是否等于setGravity,那么我如何设置重力?
  • 发布一个巨大的文档不是解决方案抱歉,
  • 在链接中查找 setGravity 方法..,不知何故重定向到确切方法不起作用..
【解决方案5】:

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

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

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

LinearLayout.LayoutParams

【讨论】:

    【解决方案6】:
    layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;
    

    使用它来添加多个重力

    【讨论】:

    • 不,就是这样:gravity = Gravity.END or Gravity.BOTTOM
    • @OleksandrNos 你写的是Kotlin语法,Omar写的是java语法。
    【解决方案7】:

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

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

    【讨论】:

    • @Muzikant.. 好的.. 我一开始没有注意到.. 但现在我清楚了.. 谢谢
    • 这是否仅通过指定首先是哪种布局才有效?像 RelativeLayout.LayoutParams ... 而不仅仅是 LayoutParams
    • RelativeLayout.LayoutParams 使用其他标志来设置视图的重力(rightOf、centerInParent、centerVertical)。此解决方法适用于 LinearLayouts 子项
    【解决方案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
    【解决方案9】:

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

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

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

    【讨论】:

      【解决方案10】:

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

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

      用于设置 Button 的 layout_gravity 使用重力场作为布局参数

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

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

      【讨论】:

        【解决方案11】:

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

        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 - 斜体))))
        【解决方案12】:

        其余的答案都是对的,我想补充更多的解释。 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() 之后你必须设置重力并不明显。你会认为你已经在新视图上设置了所有内容,然后添加它,所以这是不直观的:-P
        【解决方案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);
          

          还要检查 This,where you can find clear explanation about gravity and layout_gravity .

          【讨论】:

            【解决方案15】:

            上面的大部分答案都是对的,所以写了一个辅助方法,这样你就可以使用了 直接在你的项目中。

            以编程方式设置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;
                }
            

            【讨论】:

              【解决方案16】:

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

              但是你使用 addRule 而不是重力

              RelativeLayout.LayoutParams mCircleParams = new 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 而不是gravitiy
                【解决方案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);
                  

                  【讨论】:

                    【解决方案20】:

                    修改已有的布局参数,重新设置布局参数

                    //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
                    

                    【讨论】:

                      猜你喜欢
                      • 2013-03-31
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-01-21
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-04-13
                      • 1970-01-01
                      相关资源
                      最近更新 更多