4

我的应用程序中有许多产品的网格。当用户选择网格中的一个项目时,我将启动一个新活动作为对话框框并显示项目的名称、数量和图像。但我无法动态发送图像源。

这是我的代码

gridView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,int position, long id) {
            //Toast.makeText(getApplicationContext(),((TextView) v.findViewById(R.id.grid_item_label)).getText(), Toast.LENGTH_SHORT).show();
            Intent item_intent = new Intent(MainActivity.this, Item.class);
            item_intent.putExtra("name",((TextView) v.findViewById(R.id.grid_item_label)).getText());
            item_intent.putExtra("quantity",((TextView) v.findViewById(R.id.grid_item_quantity)).getText());

            //my problem is here***************************************************
            ImageView my_image =  findViewById(R.id.grid_item_image).getDrawable();
            item_intent.putExtra("image",my_image.getXXXXX());
            //*********************************************************************
            MainActivity.this.startActivity(item_intent);

        }
    });

我应该使用什么来从 ImageView 获取图像源?

4

7 回答 7

35

使用捆绑包

imageView.buildDrawingCache();
Bitmap image= imageView.getDrawingCache();

 Bundle extras = new Bundle();
extras.putParcelable("imagebitmap", image);
intent.putExtras(extras);
startActivity(intent);


Bundle extras = getIntent().getExtras();
Bitmap bmp = (Bitmap) extras.getParcelable("imagebitmap");

image.setImageBitmap(bmp );
于 2013-07-26T10:37:50.917 回答
2

您可以将 Parcable(例如位图)或可序列化对象放在一个包中,并从另一个活动中的包中检索对象。

您如何使用捆绑包在 android 活动之间传递图像(位图)?

尽管我不推荐它,因为您在活动之间传递了大量数据。我建议您将图像参考 ID 传递给下一个活动并在那里检索图像。

如何将 selectedListItem 的对象传递给另一个活动?

编辑:

intent.putExtra("imageId", imageId);

在其他活动中:

int imageRef = getIntent().getIntExtra("imageId", defaultValue);

http://developer.android.com/reference/android/content/Intent.html#getIntExtra%28java.lang.String,%20int%29

于 2013-07-26T10:33:34.070 回答
2

您需要使用解决方案将drawable转换为Bitmap:然后您可以通过intent将其传递给下一个活动,因为Bitmap类实现了Parcelable接口。

于 2013-07-26T10:34:52.897 回答
2

首先,您必须先保存图像,然后您可以使用此方法发送已保存图像的文件名

    void Send() { 
            if (file != null) {
            Intent intent = new Intent(this, Draw.class);
            intent.putExtra(PICTURE_FILE_ID, file);
            startActivity(intent);
        } else if (file == null) {
            Toast tst = Toast.makeText(getApplication(),
                    "Please Click Save First", Toast.LENGTH_SHORT);
            tst.setGravity(Gravity.CENTER, 0, 0);
            tst.show();
        }
}

其他活动

利用mBitmapFile = (File) getIntent().getSerializableExtra( YourClassName.PICTURE_FILE_ID);

于 2013-07-26T10:36:32.520 回答
1

您可以将您的可绘制对象转换为位图,然后转换为字节数组并有意地传递此字节数组。

Drawable d;  
Bitmap b= ((BitmapDrawable)d).getBitmap();

int bytes = b.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);  
b.copyPixelsToBuffer(buffer);  
byte[] array = buffer.array();

使用此代码:

调用活动...

Intent i = new Intent(this, NextActivity.class);
Bitmap b; // your bitmap
ByteArrayOutputStream bs = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 50, bs);
i.putExtra("byteArray", bs.toByteArray());
startActivity(i);

...在您的接收活动中

if(getIntent().hasExtra("byteArray")) {
    ImageView previewThumbnail = new ImageView(this);
    Bitmap b = BitmapFactory.decodeByteArray(
        getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); 
}
于 2013-07-26T10:35:29.823 回答
1

在活动之间传递位图数据时,我通常更喜欢将其存储在扩展的应用程序类中,您可以从所有活动中访问该类。您显然可以像其他人所说的那样,通过在 Intent 上传递它来做到这一点,但是如果您在多个活动中需要它,将它存储在应用程序中会给您更大的灵活性。

于 2013-07-26T10:36:43.243 回答
0

我遇到了同样的问题,并通过意图传递所选项目的位置来解决它。正如我认为并从堆栈专业人士那里读到的那样,它是最好的解决方案。只需在包含 GridView 的 FirstActivity.java 中执行此操作

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Intent intent = new Intent(getActivity(),DetailActivity.class);
    intent.putExtra("id",position);
     startActivity(intent);    } });

然后在您的目标 Activity 中,您必须从 extras 中获取位置并将其从您的数据库或图像数组的投射位置中提取:

Intent intent = getActivity().getIntent();
            int position = intent.getIntExtra("id",0);
            ImageAdapter imageAdapter = new ImageAdapter(getActivity());
            ImageView imageView = (ImageView)rootView.findViewById(R.id.movie_detail_image);
            imageView.setImageResource((int)imageAdapter.getItem(position));

您必须编辑您的图像适配器 getItem 方法以返回选定的图像 ID。

于 2016-03-06T17:51:09.780 回答