Android setMargins 无法以编程方式工作
Posted
技术标签:
【中文标题】Android setMargins 无法以编程方式工作【英文标题】:Android setMargins not working programmatically 【发布时间】:2016-07-09 20:58:11 【问题描述】:<RelativeLayout>
...
<ImageView
android:id="@+id/imageView1"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:layout_marginTop=”11dp”
android:background=”@drawable/image” />
</RelativeLayout>
然后我需要以编程方式设置 Margin:
ImageView imageView = (ImageView) findViewRoot(R.id.imageView1);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
params.width = 100;
params.height = 100;
params.setMargins(0,0,0,0); //NOT WORK
imageView.setLayoutParams(params);
ImageView 仍然有 marginLeft 10 和 marginTop 11;
怎么了?
【问题讨论】:
您的问题解决了吗? 不,不是。两个答案都没有解决我的问题 尝试设置参数而不获取旧参数。 请多解释一下 【参考方案1】:尝试使用ViewGroup.MarginLayoutParams 将边距设置为ImageView
。这是来自@Hiren Patel answer 的一个方法,非常适合我。
private void setMargins (View view, int left, int top, int right, int bottom)
if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams)
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
p.setMargins(left, top, right, bottom);
view.requestLayout();
如何在您的代码中使用示例:
public void testMargin(View view)
ImageView imageView = (ImageView) findViewById(R.id.imageView1);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
params.width = 100;
params.height = 100;
setMargins(imageView , 0, 0, 0, 0);
imageView.setLayoutParams(params);
我的测试布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:background="@android:color/holo_blue_light"
tools:context="com.g2o.test.TestActivity">
<View
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:background="@android:color/holo_red_dark" />
<ImageView
android:id="@+id/imageView1"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_marginLeft="100dp"
android:layout_marginTop="100dp"
android:adjustViewBounds="true"
android:background="@drawable/cast_ic_notification_0" />
<Button
android:id="@+id/test"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:onClick="testMargin"
android:text="Test" />" />
</RelativeLayout>
希望这会有所帮助!
【讨论】:
这行不通。不要做任何事。仍然有 10 和 11 边距 也许是因为我也改变了尺寸? 我的父布局是相对布局。什么都没有 我测试了你的样品并且对我很好。我用我的测试布局和我的活动编辑了我的答案,我还添加了android:adjustViewBounds="true"
以使 ImageView 适合实际图像大小以避免任何额外的边距。如果这不适合你,请告诉我。
好的,如果还有问题请告诉我。【参考方案2】:
您是否尝试制作新的 LayoutParams?
ImageView imageView = (ImageView) findViewRoot(R.id.imageView1);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
);
params.setMargins(0,0,0,0);
imageView.setLayoutParams(params);
【讨论】:
这行不通。什么都没有发生,仍然有相同的边距【参考方案3】:希望这有助于将您的 ImageView 放入 RelativeLayout 并将其宽度和高度设置为 Match-Parent
<RelativeLayout
android:id="@+id/lay_expandable"
android:layout_
android:layout_
>
<ImageView
android:layout_
android:layout_
android:src="@mipmap/ic_expansion" />
</RelativeLayout>
在你的活动中使用LinearLayout.LayoutParams
例如
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.MATCH_PARENT, 400);
lay_layout.setLayoutParams(params);
//注意扩展相对布局,而不是图片本身
【讨论】:
【参考方案4】:这可能对某人有用: 在我的情况下,我正在处理同样的问题,在 android api 19 上没有识别出边距,所以我所做的是改变图像的大小(增加一点),然后调整填充,如下所示:
file: dimens.xml
<dimen name="image_padding_right">5dp</dimen>
然后上代码:
val imageView1 = ImageView(this.activity)
imageView1.setPadding(0,0,
resources.getDimension(R.dimen.image_padding_right).roundToInt(), 0)
imageView1.cropToPadding = true
选项 cropToPadding 允许您执行解决方法,以防边距不起作用。
希望对你有帮助。
【讨论】:
以上是关于Android setMargins 无法以编程方式工作的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何以编程方式设置 LinearLayout 边距
android以编程方式在radiogroup按钮之间添加填充
Android:以编程方式在 FrameLayout 中设置边距 - 不起作用