使用Picasso和Glide获取黑色ImageView

44

问题

我正在编写一个安卓应用程序,希望它具有“幻灯片”功能。我找到了这个不错的库,基于Picasso,完全符合我的需求,并且大多数时候都可以正常工作。

问题是,有时我的图片无法加载到幻灯片ImageView中... 正如您在下面的截图中看到的那样,它只显示一个“黑色画布”。

enter image description here

我正在从我的可绘制资源中加载本地资源的图像。有时在纵向模式下发生,有时在横向模式下发生。使用哪个图像并不重要,有时会出现“黑色”情况。
编辑:
- 我正在使用Android 5.0.2和4.4.2 - 在4.4.2上似乎不会发生。只有在5.0.2上才会发生。 - 它发生在一个装有Android 5.1的Moto X 2014上。 - 我尝试加载的图像在磁盘上有45KB,分辨率为900x445。 - 我已经打开了布局矩形,这是结果:

Single slide

并且在滚动时保持不变。

enter image description here

有时候,它会变成白色而不是黑色(或者先是白色,然后变成黑色)。

enter image description here

我尝试了其他方法: 我的可绘制资源位于res/drawable文件夹中,当我将这些文件从该文件夹更改为res/drawable-xxxhdpi时,在5.0.2设备上滑块起作用了。什么鬼???

到目前为止我都尝试了什么

我尝试了不同的图片,加载多个图片到幻灯片上,甚至this pull request将Picasso更改为Glide。没有任何效果,错误似乎是随机的。

有一次我尝试使用网络URL而不是本地存储中的实际可绘制资源,它奏效了。使用完全相同的图片。

以下是我如何加载这些图片的:

Fragment.java

private SliderLayout slider;
private PagerIndicator indicator;

// ...

private void setupSlider() {

    HashMap<String,Integer> file_maps = new HashMap<>();

    file_maps.put("Blah",R.drawable.banner_1);
    file_maps.put("Bleh",R.drawable.banner_2);
    file_maps.put("Blih",R.drawable.banner_3);
    file_maps.put("Bloh",R.drawable.banner_4);

    for (String name : file_maps.keySet()) {

        DefaultSliderView dsv = new DefaultSliderView(getActivity());

        dsv.description(name)
                .image(file_maps.get(name))
                .error(R.drawable.banner_error)
                .empty(R.drawable.empty)
                .setScaleType(BaseSliderView.ScaleType.Fit)
                .setOnSliderClickListener(this);

        //add your extra information
        dsv.bundle(new Bundle());
        dsv.getBundle()
                .putString("extra",name);

        slider.addSlider(dsv);
    }

    slider.setPresetTransformer(SliderLayout.Transformer.Default);
    slider.setCustomIndicator(indicator);
    slider.setCustomAnimation(new DescriptionAnimation());
    slider.setDuration(4000);
    slider.addOnPageChangeListener(this);

}

fragment.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.fragments.Fragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/sv_main">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/rl_main">

            <com.daimajia.slider.library.SliderLayout
                android:id="@+id/slider"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                />
            <com.daimajia.slider.library.Indicators.PagerIndicator
                android:id="@+id/custom_indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_below="@+id/slider"
                custom:shape="oval"
                custom:selected_color="#00BFA5"
                custom:unselected_color="#55333333"
                custom:selected_padding_left="@dimen/spacing_medium"
                custom:selected_padding_right="@dimen/spacing_medium"
                custom:selected_padding_top="3dp"
                custom:selected_padding_bottom="@dimen/spacing_small"
                custom:unselected_padding_left="@dimen/spacing_medium"
                custom:unselected_padding_right="@dimen/spacing_medium"
                custom:unselected_padding_top="@dimen/spacing_small"
                custom:unselected_padding_bottom="4dp"
                custom:selected_width="@dimen/spacing_medium"
                custom:selected_height="@dimen/spacing_medium"
                custom:unselected_width="6dp"
                custom:unselected_height="6dp"
                />

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@+id/custom_indicator"
                android:id="@+id/ll_main_body">

            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

    <!-- Other stuff -->

</RelativeLayout>

我正在跟随教程,它来自于维基页面。但是LogCat没有抛出任何错误,这让问题变得更加困难。

你有什么想法吗?


你可能会遇到 OutOfMemoryError。你是否开启了 Picasso 或 Glide 的调试模式?Drawable 多大? - Jared Rummler
我会尝试在开发者设置中启用布局矩形的显示,然后确保实际上有一个黑色的ImageView,因为我猜测该视图的宽度和/或高度为0... - David Medenjak
3
我在使用完全相同的库时遇到了同样的问题,后来我更换了我的测试设备,并且它在其他设备上运行良好。 之前我在Moto G上进行了测试,但无法正常工作,然后我在Nexus 5和Note 3上进行了测试,它可以正常工作。 虽然不知道原因 :/ ,但可以尝试另一台设备。 - rusted brain
1
你的背景默认是黑色吗?我知道Picasso更喜欢使用弱引用来处理图片,所以这可能会成为一个问题。 - Lars Celie
1
在 Glide 中查看相关问题:https://github.com/bumptech/glide/issues/738。针对特定设备有一个修复方案,但如果有足够的信息,可以添加更多修复方案。 - TWiStErRob
显示剩余9条评论
3个回答

1
在资源文件夹中创建一个名为drawable-nodpi的文件夹,将您的图像放入其中,而不是放入不同的文件夹或drawable文件夹中。

那并没有解决问题。但是把图片放在drawable文件夹里是个错误,谢谢 :) - Mauker

0
你尝试过使用 ViewPagerImageView,并将图像 URI 数组传递给适配器吗?如果你自己实现它,我认为你可以更好地避免和调试问题。

那是我的第一种方法,但没有这个库可以提供的好函数。 - Mauker

0

这个库对我来说很好用,第一次使用就非常顺利。它是一个非常好的库。

首先

SliderLayout没有被任何东西引用。那就是魔法发生的地方。创建一个xml布局并通过SliderLayout引用它。之后不要忘记调用startAutoScroll(),在onPause()中停止自动滚动。

https://github.com/daimajia/AndroidImageSlider/wiki/Start-Using

上面的链接基本上就是你需要的。

其次

问题也可能是它在scrollView内部。滚动回调可能出现了问题。

制作一个简单的布局,从一个简单的滑块开始,逐步进行自定义。

祝你好运。


实际上,它已被引用,我只是让代码更短而已。它也工作了,大多数时间都是没问题的。 我不知道问题是否出在ScrollView上。如果是的话,为什么只有少数设备会出现这种情况呢? - Mauker
由于嵌套滚动仅支持API 21及以上版本。 - Arnold Balliu
无论如何,我建议您更改布局以支持早期设备。 - Arnold Balliu
实际上不是这样的。作为support v4的一部分,它支持API级别为4或更高的设备。 - Mauker
NestedScrollView没问题...但是你正在使用一个带有滚动机制的SliderLayout放在ScrollView里面... - Arnold Balliu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接