【问题标题】:Set margins in a LinearLayout programmatically以编程方式在 LinearLayout 中设置边距
【发布时间】:2011-01-29 16:50:28
【问题描述】:

我正在尝试使用 Java(不是 XML)创建一个带有按钮的 LinearLayout,这些按钮可以填满屏幕并有边距。这是没有边距的代码:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

这样可以正常工作,但是到底如何给按钮留出边距以便它们之间有空间?我尝试使用LinearLayout.MarginLayoutParams,但它没有weight 成员,所以它不好。如果你在它的构造函数中传递lp,它也不起作用。

这不可能吗?因为它看起来确实如此,而且它不会是您只能在 XML 中执行的第一个 Android 布局任务。

【问题讨论】:

  • developer.android.com/reference/android/view/…, int, int, int) 而不是 layoutParams.setMargins(30, 20, 30, 0);你把 layoutParams.setMargins(30dp, 20dp, 30dp, 0dp);
  • setMargins 将 int 作为参数。您只能使用 xml 属性提供“dp”

标签: java android layout view margin


【解决方案1】:

这样可以正常工作,但究竟如何 你给按钮边距吗 它们之间有空间吗?

您在 LinearLayout.LayoutParams 对象上调用 setMargins()。

我尝试使用 LinearLayout.MarginLayoutParams,但是 没有重量成员,所以没有 不错。

LinearLayout.LayoutParams 是LinearLayout.MarginLayoutParams 的子类,如documentation 所示。

这不可能吗?

没有。

它不会是第一个 Android 只能在 XML 中完成的布局任务

欢迎您提供此声明的证据。

就我个人而言,我不知道任何只能通过 XML 而不能通过 SDK 中的 Java 方法完成的事情。事实上,根据定义,一切都必须通过 Java 实现(尽管不一定通过 SDK 可访问的方法),因为 XML 不是可执行代码。但是,如果您知道某些事情,请指出,因为这是 SDK 中的错误,应该有朝一日会得到修复。

【讨论】:

  • 哈,好的,我现在明白了。在相当复杂的布局系统中迷失了一些。我认为无论如何都不能在运行时设置 layout_widgth/height。
  • 而且无法设置样式:stackoverflow.com/questions/2016249/…
  • 我在运行时通过LayoutPararms 设置宽度和高度没有问题。我的风格……是的,嗯,我不使用它们是有原因的。 :-)
  • 我想知道为什么以编程方式生成 UI 是这样一个 PITA
  • 我花了很长时间才意识到,事实上几天前我导入了不支持边距的错误 LayoutParams...阅读这些答案后,我决定删除我的导入。有超过 10 个选项 D:我选择了 linearLayout.LayoutParams。工作。
【解决方案2】:

这里有一个小代码来完成它:

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

【讨论】:

  • 感谢一个中肯的代码示例——比描述更有益
  • 看起来边距参数是以像素为单位设置的。有什么办法可以在dps中设置它们?
  • @ArtemRussakovskii 像 Android 中的大多数功能一样,它们需要像素。我建议使用一个将 dips 转换为 px 的全局效用函数。这就是我在所有应用程序中所做的。 Android API 很烂。
  • @MaxHowell 这就是我最终要做的。令人难以置信的是,有时会缺少诸如此类的基本内容。
  • @ArtemRussakovskii - 使用 TypedValue.applyDimension(...) 将 DIP 转换为 PX。见stackoverflow.com/questions/2238883/…
【解决方案3】:

要直接向项目添加边距(某些项目允许直接编辑边距),您可以:

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

...这无需了解/编辑周围的布局即可工作。请注意“instanceof”检查,以防您尝试针对不支持边距的内容运行此检查。

【讨论】:

  • 正是我要找的。​​span>
【解决方案4】:

试试这个

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);

【讨论】:

    【解决方案5】:

    由于设备屏幕像素密度的变化,最好始终使用DIP 单位以编程方式设置边距。如下图_

    //get resources
    Resources r = getResources();
    float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
    float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
    float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
    float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
    
    //get layout params...
    LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));
    
    //set margin...
    yourLayoutTOsetMargin.setLayoutParams(params); 
    

    希望这会有所帮助。

    【讨论】:

      【解决方案6】:

      我已经使用下面的代码直接设置了边距

      LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
      LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
      params.setMargins(3, 300, 3, 3); 
      layout.setLayoutParams(params);
      

      这里唯一需要注意的是,LayoutParams 应该为下面的包android.widget.RelativeLayout.LayoutParams 导入,否则会出错。

      【讨论】:

        【解决方案7】:
        /*
         * invalid margin
         */
        private void invalidMarginBottom() {
            RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
            lp.setMargins(0, 0, 0, 0);
            frameLayoutContent.setLayoutParams(lp);
        }
        

        你要注意view的viewGroup的类型,比如上面的代码,我想改变frameLayout的margin,而frameLayout的view group是RelativeLayout,所以你需要转换为 (RelativeLayout.LayoutParams)

        【讨论】:

          【解决方案8】:
           MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
           layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
          

          【讨论】:

          • “虽然这段代码可以回答这个问题,但最好在此处包含对代码的解释。
          【解决方案9】:

          这里单行解决方案:

          ((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
          

          【讨论】:

            【解决方案10】:

            试试这个:

            MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
            params.width = 250;
            params.leftMargin = 50;
            params.topMargin = 50;
            

            【讨论】:

              【解决方案11】:

              核心-KTX:


               updateLayoutParams<RecyclerView.LayoutParams> {
                              topMargin = 10
                              rightMargin = 10
                              bottomMargin = 10
                              leftMargin = resources.getDimensionPixelSize(R.dimen.left)
                          }
              

              使用您在 ViewGroup 上的任何视图,而不是 RecycleView。


              PS。 Vel_daN:爱​​你所做的事情?。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-15
                • 2014-10-25
                • 2017-08-23
                • 2019-10-19
                • 2023-04-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-22
                相关资源
                最近更新 更多