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 中以编程方式设置按钮的边距?

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

Android 中setMargins和setPadding的区别

setMargin以适合位图尺寸