Android:以编程方式在 FrameLayout 中设置边距 - 不起作用

Posted

技术标签:

【中文标题】Android:以编程方式在 FrameLayout 中设置边距 - 不起作用【英文标题】:Android: Set margins in a FrameLayout programmatically- not working 【发布时间】:2011-12-27 10:37:01 【问题描述】:

这是代码-

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) searchPin.getLayoutParams();
params.setMargins(135, 176, 0, 0);
//params.leftMargin = 135; // also not worked 
//params.topMargin = 376;
searchPin.setLayoutParams(params);

无论何时何地,从 xml 它的工作 -

android:layout_marginLeft="135dp"

可能是什么原因?我错过了什么吗!

-thnx

【问题讨论】:

***.com/questions/5401952/… 【参考方案1】:

试试这个:

params.gravity = Gravity.TOP;

【讨论】:

甚至:params.gravity = Gravity.NO_GRAVITY;【参考方案2】:

我有一个 RelativeLayout 的 FrameLayout 子级,因此框架试图将 FrameLayout 参数转换为 RelativeLayout,我通过这种方式解决了

FrameLayout mylayout = (FrameLayout) view.findViewById(R.id.mylayout);
ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mylayout.getLayoutParams();
params.setMargins(1, 2, 3, 4);
mylayout.setLayoutParams(params);

【讨论】:

如果您的 FrameLayout 是 RelativeLayout 的子级。你已经将 RelativeLayout.LayoutParams 设置为 FrameLayout 同意罗马黑:这是对我有用的解决方案。您需要使用父项的类型设置参数。 也许@sherpya 没有清楚地表达自己,但他确实说明了一点。 FrameLayout.LayoutParamsViewGroup.LayoutParams 不一样【参考方案3】:

我认为您缺少的是,当您以编程方式设置元素的参数时,这些参数实际上是提供给父视图,以便它知道如何定位元素。参数不会设置回元素本身。考虑以下代码示例。另请注意,布局参数是父级的类型。

LinearLayout linearLayout = new LinearLayout(this);

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

layoutParams.setMargins(6,6,6,6);

Button someButton=new Button(this);
someButton.setText("some text");

linearLayout.addView(someButton, layoutParams);

【讨论】:

那么子元素应该怎么做呢?取而代之的是,我是否需要为父级添加填充 - 以正确放置子级! 不,您不必将子元素的填充设置为父元素的填充。这个想法更像是,您将(子元素+子元素布局参数)都提供给父元素,就像在 addView 行中一样。 也不行,使用带两个参数的addView,或者直接给view设置布局参数,结果一样【参考方案4】:

你可以试试这个

FrameLayout.LayoutParams srcLp = (FrameLayout.LayoutParams)searchPin.getLayoutParams();
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(srcLp.width, srcLp.height, srcLp.gravity);

lp.setMargins(srcLp.leftMargin, srcLp.topMargin, srcLp.rightMargin, srcLp.bottomMargin);

searchPin.setLayoutParams(lp);

【讨论】:

【参考方案5】:

简单的解决方案-

searchPin = (ImageView) findViewById(R.id.waypts_search_pin);
searchPin.setPadding(135, 176, 0, 0);

【讨论】:

好吧,这并不能真正帮助其他正在寻找问题答案的人,填充不会移动框架上的背景,只会移动内容。【参考方案6】:

只需使用 LayoutParams 而不是 FrameLayout.LayoutParams

LayoutParams params = (LayoutParams) searchPin.getLayoutParams();
params.setMargins(135, 176, 0, 0);
searchPin.setLayoutParams(params);

这对我有用

【讨论】:

LayoutParams 没有 setMargins 方法。您刚刚导入了 android.widget.FrameLayout.LayoutParams

以上是关于Android:以编程方式在 FrameLayout 中设置边距 - 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置 android:animateLayoutChanges

如何在 Android 10 中以编程方式安装任何 Android 应用

Android:以编程方式在片段中添加多个 RecyclerView

如何以编程方式在 Android 中包含布局?

在 Android 上以编程方式使用 Instagram

Android 编程:如何以网格方式以编程方式创建各种视图类型