在我的应用程序中,我可以用照片创建相册,将它们存储在Firebase上并查看它们。
嗯,为了浏览这些相册,我决定创建一些东西,比如在Play商店中全屏查看应用程序/游戏的截图。我创建了Activity
,并将ViewPager2
添加到这个Activity
中,然后我创建了Fragment
和Adapter
来显示我的图像,一切似乎都能正常工作,但Glide存在一些问题。
首先,我尝试使用以下代码加载照片:Glide.with(MediaViewerFragment.this).load(imageUrl).into(image);
,但图片没有显示。
在stackoverflow上,我找到了一个解决方案--在方法中添加一个侦听器,使用submit()
代替into(View)
。因此,我编写了这样一个侦听器:
RequestListener<Drawable> listener = new RequestListener<>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
errorLinear.setVisibility(View.VISIBLE);
errorReasonText.setText(e.getMessage());
loadingLinear.setVisibility(View.GONE);
Log.d("Test", "Glide: Cannot load image: " + e.getMessage());
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
image.setImageDrawable(resource);
image.invalidate();
loadingLinear.setVisibility(View.GONE);
Log.d("Test", "Glide: Image loaded");
return false;
}
};
Glide.with(MediaFragment.this).load(imageUrl).addListener(listener).submit();
但是:
- 当我打开相册时,第一个片段中的照片在加载后不会立即显示,只有当我用手指触摸ViewPager 2或滚动到下一个片段并返回到第一个片段时,图像才会“加载到imageview”。
- ProgressBar不会在第一个片段上消失
我不知道为什么会这样,我认为这是因为第一个滑翔听众在其他片段中被其他听众取代开始?
正如你所看到的,在OnResourceReady
中我有Log.d("Test", "Glide: Image loaded");
,但是它并没有出现在LogCat中(在第一个片段上,当我滑动到其他片段时,一切都正常!)。但是当我把Log.d("Test", "Glide: Image loaded");
放在上面时,它看起来会像这样:
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
Log.d("Test", "Glide: Image loaded");
image.setImageDrawable(resource);
image.invalidate();
loadingLinear.setVisibility(View.GONE);
return false;
}
然后:
- 当我打开相册,然后立即在logcat我得到我的消息,照片已上传,但不幸的是,我仍然看不到它和ProgressBar没有消失。
- 我仍然需要滑动到下一个片段,然后返回到上一个片段才能看到该图像。
Video describing the problem-您可以看到,我必须触摸屏幕才能加载照片,这很奇怪,不应该发生
MediaViewerFragment.java
public class MediaViewerFragment extends Fragment {
View mRootView;
private ImageView image;
private LinearLayout errorLinear, loadingLinear;
private MaterialTextView errorReasonText;
private String imageUrl;
private Context context;
@Override
public void onDestroyView() {
context = null;
super.onDestroyView();
}
public MediaViewerFragment(Context context, String imageUrl) {
this.imageUrl = imageUrl;
this.context = context;
Log.d("Teest", "MediaFragment - Image to load: " + imageUrl);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.fragment_media, container, false);
return mRootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
setup();
}
private void initView() {
image = mRootView.findViewById(R.id.image);
errorLinear = (LinearLayout) mRootView.findViewById(R.id.error_linear);
errorReasonText = (MaterialTextView) mRootView.findViewById(R.id.error_reason_text);
loadingLinear = mRootView.findViewById(R.id.loading_progress_bar);
}
private void setup() {
Log.d("Test", "Preparing to load image: " + imageUrl);
RequestListener<Drawable> listener = new RequestListener<>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
errorLinear.setVisibility(View.VISIBLE);
errorReasonText.setText(e.getMessage());
loadingLinear.setVisibility(View.GONE);
Log.d("Test", "Glide: Cannot load image: " + e.getMessage());
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
image.setImageDrawable(resource);
image.invalidate();
loadingLinear.setVisibility(View.GONE);
Log.d("Test", "Glide: Image loaded");
return false;
}
};
Glide.with(MediaViewerFragment.this)load(imageUrl).addListener(listener).submit();
}
}
ViewPager适配器:
public class MediaViewerViewPager extends FragmentStateAdapter {
private List<AlbumImage> imagesUrls;
private Context context;
public MediaViewerViewPager(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, Context context, List<AlbumImage> imagesUrls) {
super(fragmentManager, lifecycle);
this.imagesUrls = imagesUrls;
this.context = context;
}
@NonNull
@Override
public Fragment createFragment(int position) {
return new MediaFragment(context, imagesUrls.get(position).getImageUrl());
}
@Override
public int getItemCount() {
return imagesUrls.size();
}
}
我的ViewPager 2所在的活动:
public class MediaViewerActivity extends AppCompatActivity {
private ViewPager2 imagesViewpager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_viewer);
initView();
setup();
}
private void initView() {
imagesViewpager = (ViewPager2) findViewById(R.id.images_viewpager);
}
private void setup() {
MediaViewerViewPager adapter = new MediaViewerViewPager(getSupportFragmentManager(), getLifecycle(), MediaViewerActivity.this, new Gson().fromJson(getIntent().getStringExtra("albumImages"), new TypeToken<List<AlbumImage>>() {}.getType()));
imagesViewpager.setAdapter(adapter);
}
}
固定
将placeholder
和error
方法添加到代码中之后,一切都正常了。正确的代码如下所示:
Glide.with(image)
.load(getImageUrl())
.placeholder(R.drawable.transparent_background)
.error(R.drawable.transparent_background)
.addListener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
loadingLinear.setVisibility(View.GONE);
errorLinear.setVisibility(View.VISIBLE);
errorReasonText.setText(e.getMessage());
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
loadingLinear.setVisibility(View.GONE);
return false;
}
})
.into(image);
1条答案
按热度按时间klr1opcd1#
您是否尝试过使用
并设置
placeholder
图像和error
图像。它可能会让你知道发生了什么!就像这样-