问题描述
我有一个活动,可以滚动浏览图片列表,显示全屏图片(默认情况下,在进入活动时)或图片下方有一些详细信息。我通过更改包含详细信息的 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 之前有一个可见的瞬间,尤其是在图片尚未缓存的情况下。 如果有人找到更好的方法,请告诉我。