【问题标题】:Why my ImageView would not change width in Android?为什么我的 ImageView 在 Android 中不会改变宽度?
【发布时间】:2017-08-03 01:54:17
【问题描述】:

我正在开发一个带有头像(图像图标)的 Android 应用,ImageView 位于这样的 RelativeLayout 中

   <ImageView
        android:id="@+id/indicators"
        android:layout_width="@dimen/conversation_avatar_size"
        android:layout_height="@dimen/conversation_list_left_indicator_height"
        android:layout_below="@id/contact_image"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginEnd="@dimen/smaller_def_margin"
        android:layout_marginTop="@dimen/smaller_def_margin"
        android:scaleType="fitCenter"
        tools:src="@drawable/ic_reply"/>

但是,当我使 contact_image 不可见时,我无法更改此 ImageView 的宽度,因为指示器占用的空间更少。代码如下

            indicators.getLayoutParams().width = width;
            indicatorsWidth = indicators.getWidth();
            indicators.requestLayout();

indicators.requestLayout(); 之后,指示器的宽度仍然保持旧的未更改为宽度。我想知道为什么会发生这种情况?我也试过indicators.setLayoutParams(layoutParams);,但还是不行。 我确实发现了一些有趣的东西,尽管 indicators.getWidth() 仍然是旧值,indicators.getLayoutParams().width 现在是新宽度,并且 ImageView 大小根本没有改变。 更新:我找到view.getWidth()是什么,然后我用indicators.setLeft()indicators.setRight(),这次indicators.getWidth()也是新的宽度,但是大小还是没变,我查了一下发现@ 987654331@ 仍然是旧值,知道吗?

【问题讨论】:

    标签: android xml android-layout android-imageview


    【解决方案1】:

    如果ImageView 的高度是限制因素,您的问题可能是android:scaleType="fitCenter"。视图将调整大小以适应高度并通过调整宽度来保持纵横比。见this

    计算将保持原始 src 纵横比的比例,但也将确保 src 完全适合 dst。至少一个轴(X 或 Y)将完全适合。结果以 dst 为中心。

    这是一个小应用程序来玩这个概念。你会看到,即使宽度改变了,高度也没有android:scaleType="fitCenter"。如果您将其更改为android:scaleType="fitXY",您将看到更改。这可能不是您的问题,但您可以使用 MCVE 的代码来测试一些想法。

    MainActivity.java

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final ImageView indicators = findViewById(R.id.indicators);
            indicators.postDelayed(new Runnable() {
                @Override
                public void run() {
                    indicators.getLayoutParams().width = 500;
                    indicators.requestLayout();
                }
            }, 2000);
        }
    }
    

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/indicators"
            android:layout_width="100px"
            android:layout_height="100px"
            android:layout_alignWithParentIfMissing="true"
            android:scaleType="fitCenter"
            android:src="@mipmap/ic_launcher"/>
    </RelativeLayout>
    

    【讨论】:

    • 谢谢!我觉得你的解释很好。但后来我使用indicators.setScaleType(ImageView.ScaleType.FIT_END); 和 FIT_XY,仍然无法正常工作。这真的很奇怪。
    • 我更新了问题,似乎 layoutpramas.width 发生了变化,而 imageview.width 没有改变......
    • 我再次更新,使用setLeft()setRight() 来获得正确的宽度,但是getMeasuredWidth() 仍然是旧值。大小不会改变。
    • 我发现了问题所在。这实际上是因为有一个类负责确定所有视图的坐标,但是,它是先测量的,因此您无法动态更改它。但是你说的是对的。谢谢!
    【解决方案2】:

    修改LayoutParams时,必须将对象重新分配回视图,否则没有效果。

    ViewGroup.LayoutParams params = myView.getLayoutParams();
    params.width = newWidth;
    myView.setLayoutParams(params);
    

    最后一行实际上改变了视图的宽度。

    【讨论】:

    • @litaoshen 我不确定你的意思。调用params.width = foo时修改参数,调用myView.setLayoutParams()时新参数实际生效。
    • 我尝试了同样的事情,但它不起作用。我不应该说参数,对不起。实际上 params.mWidth 已更改但 view.getWidth() 没有更改,然后如果我手动更改 mLeft 和 mRight,getWidth() 也会更改。但 getMeasuredWidth() 仍会保留旧值。你可以看到我的更新。
    • @litaoshen 如果您发布您的整个布局以及您尝试的完整代码,我将更有能力提供帮助
    • 我发现了问题所在。这实际上是因为有一个类负责确定所有视图的坐标,但是,它是先测量的,因此您无法动态更改它。但是你说的是对的。谢谢!
    猜你喜欢
    • 2016-02-18
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多