在我的應用程式中,我可以創建帶有照片的相冊,將它們存盤在 Firebase 上并查看它們。
好吧,為了瀏覽這些專輯,我決定創建一些東西,比如在 Play 商店中全屏查看應用程式/游戲的螢屏截圖。我創建Activity并添加ViewPager2到這個Activity,然后我創建Fragment并Adapter顯示我的影像,一切似乎都有效,但 Glide 存在一些問題。
首先,我嘗試使用此代碼加載照片:
Glide.with(MediaViewerFragment.this).load(imageUrl).into(image);但圖片未顯示。
在stackoverflow上我找到了一個解決方案——它是在方法中添加一個監聽器而不是into(View)使用submit()所以我寫了一個這樣的監聽器:
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();
但:
當我打開相冊時,第一個 Fragment 中的照片在加載后不會立即出現,只有當我用手指觸摸 ViewPager2 或滾動到下一個 Fragment 并回傳到第一個時,影像才會“加載到 imageview”。
ProgressBar 在第一個片段上不會消失
我不知道為什么會這樣。我認為發生這種情況是因為第一個 Glide 偵聽器可能開始被其他帶有影像的片段中的其他偵聽器取代?
如您所見,在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 也沒有消失。
我仍然需要滑動到下一個片段并回傳上一個才能看到該影像。
描述問題的視頻- 你可以看到我必須觸摸螢屏才能加載照片,這很奇怪,不應該發生
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();
}
}
我的 ViewPager2 所在的活動:
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);
}
}
固定的
將placeholderanderror方法添加到代碼后,一切正常。正確的代碼現在看起來像這樣:
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);
uj5u.com熱心網友回復:
您是否嘗試過使用加載
Glide.with(View)
并設定placeholder影像和error影像。它可能會讓你知道發生了什么!
像這樣的東西 -
Glide.with(view)
.load(imageUrl)
.error(R.drawable.someErrorImage)
.placeholder(R.drawable.somePlaceHolderImage)
.into(view);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/521287.html
標籤:爪哇安卓安卓片段机器人滑翔android-viewpager2
上一篇:隱藏系統欄并在片段中全屏顯示
