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.LayoutParams
与 ViewGroup.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 应用