Android Studio:在布局更改为正确布局后加载 ImageView

Android Studio: Load ImageView after layout change to proper layout

我有一个 Activity 可以滚动浏览图片列表,显示全屏图片(默认情况下,输入 activity 时)或下面有一些细节的图片。我通过更改包含详细信息的 FrameLayout 的可见性来做到这一点。

当图片全屏时,我想看到所有图片,所以我用 Glide 加载它;当我想查看细节时,我使用 centerCrop() 加载它。 问题是,当我想重新加载图片(从全屏模式到细节模式)时,imageView 保留旧布局,并在其上使用 centerCrop() (因为示例是来自同一设备的屏幕截图,它什么都不做) .

如果我只是在详细信息模式下滚动到下一张图片并返回,它会按预期工作。 我尝试了其他帖子中的一些内容(AsyncTast、invalidate、requestLayout),但 none 似乎有效。

从全屏模式向上滑动时:

我得到的: 我想要的是:

activity的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    <!-- irrelevant stuff -->
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/frameLayoutZoomImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <com.example.gallery_app.customViews.ZoomImageView
            android:id="@+id/fullscreen_ImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <!-- a layout on top of the ImageView that contains some hidden buttons-->
    </FrameLayout>

    <FrameLayout
        android:id="@+id/detail_split_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3">

        <include
            layout="@layout/activity_image_detail"
            android:layout_height="match_parent"
            android:layout_width="match_parent" />
    </FrameLayout>
</LinearLayout>

想通了(有点),所以我想我会写给处于相同情况的任何人。 由于您需要 activity 重新计算布局,然后 运行 与加载图片相关的代码,因此如果您使用处理程序,它就可以工作,如下所示:

import android.os.Bundle
class FullscreenImageActivity : AppCompatActivity(), MyFlingListener{
  private val handler = Handler()
  private val loadSplitScreenPictureRunnable = Runnable {
    //code that loads the inageView
  }

  private fun loadSplitScreenPicture(){
    handler.post(loadSplitScreenPictureRunnable)
    //there is no need to use postDelayed
  }
}

此方法的明显缺点是在处理程序执行 Runnable 之前有一个可见的瞬间,尤其是在图片尚未缓存的情况下。 如果有人找到更好的方法,请告诉我。