如何将网络 ImageView(排球库)内容传递给另一个活动?

how to pass NetworkImageView(volley library) content to another actvity?

我在 ListView 中有两个 NetworkImageView 元素,一个是可见的 NetworkImageView 元素,另一个是不可见的 NetworkImageView 元素。我已经为 Listview 元素实现了一个 onlickListener,只要我 select ListView 中的元素,它就会调用一个新的 activity。当调用新的 activity 时,我将这两个 NetworkImageView 元素传递给新的 activity。但我只能在新的 activity 中看到可见的 NetworkImageView 元素和一个空白的 space 而不是另一个 NetworkImageView 元素。

main_activity.java

的代码
ListView lv=(ListView) findViewById(R.id.list);
lv.setOnItemClickListener(new OnItemClickListener() 
{
        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id)
        {
            try{
                ImageView image1=(ImageView) view.findViewById(R.id.visible);
                ImageView image2=(ImageView) view.findViewById(R.id.invisible);
                image1.buildDrawingCache();
                image2.buildDrawingCache();
                Bitmap bmp1=image1.getDrawingCache();
                Bitmap bmp2=image2.getDrawingCache();
                Intent i=new Intent(MainActivity.this, new_Activity.class);
                i.putExtra("picture1", bmp1);
                i.putExtra("picture2", bmp2);
                startActivity(i);
                }
            catch (Exception e)
{Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();}}});

new_Activity.java

代码
Intent i = getIntent();

    Bitmap bmp1=(Bitmap)i.getParcelableExtra("picture1");
    Bitmap bmp2=(Bitmap)i.getParcelableExtra("picture2");

    ImageView image1 = (ImageView) findViewById(R.id.desc_image1);
    ImageView image2 = (ImageView) findViewById(R.id.desc_image2);

    image1.setImageBitmap(bmp1);
    image2.setImageBitmap(bmp2);

XML 个文件

activity_main.xml

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/visible"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/invisible"
    android:visibility="gone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

new_activity xml

<ImageView
    android:id="@+id/desc_image1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<ImageView
    android:id="@+id/desc_image2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

确保已在不可见的 NetworkImageView 中设置图像。 只需使其可见并检查图像是否已设置。

喜欢...

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/invisible"
    android:visibility="visible"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

此外,

bmp2=image2.getDrawingCache(); 

我猜只拍了可见部分。

谢谢。

而不是

Bitmap bmp1=image1.getDrawingCache();

尝试

Bitmap bmp1 = ((BitmapDrawable)image1.getDrawable()).getBitmap();

我遇到了类似的问题。在我的 ListView 中,每个项目都包含一个 ImageView 来显示来自服务器的图像,我需要在 View 中显示它以支持用户单击 ImageView 时的缩放功能。

我试过这个:

holder.iv.setDrawingCacheEnabled(true);
Bitmap bitmap = ((ImageView) v).getDrawingCache();
mBrowseImageListener.onBrowseImage(bitmap);

但是当列表长度超过一个屏幕时,我得到一个错误的位图,通常是另一个项目上当前显示的位图。

我试过这个:

holder.iv.setDrawingCacheEnabled(true);
Bitmap bitmap = ((ImageView) v).getDrawingCache();
mBrowseImageListener.onBrowseImage(bitmap);
holder.iv.setDrawingCacheEnabled(false);

不幸的是,这导致了致命异常:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap

最后我找到了这个解决方案:

Drawable drawable = holder.iv.getDrawable();
if (!(drawable instanceof BitmapDrawable)){
    Log.e(LOG_TAG, "This drawable is not an instance of BitmapDrawable!");
    return;
}
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
if (bitmap==null || bitmap.isRecycled()){
    Log.w(LOG_TAG, "This bitmap was recycled!");
    return;
}
mBrowseImageListener.onBrowseImage(bitmap);

希望对您有所帮助。