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

问题描述

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

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

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

从全屏模式向上滑动:

我得到了什么:

我想要的是:

活动的布局:

<?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 之前有一个可见的瞬间,尤其是在图片尚未缓存的情况下。 如果有人找到更好的方法,请告诉我。