首页 > 解决方案 > 如何从视图元素中获取点击的卡片视图图像的 ID

问题描述

在我的布局应用程序中,我有一个卡片视图,其中每张卡片都包含一个应用程序的表示。在每张卡片中都有:应用程序的名称、描述和他的图标。

@Override
    public void onBindViewHolder(@NonNull final AdapterForCard.ViewHolder holder, final int position) {

        holder.iv.setImageDrawable(myCards.get(position).getIcon());
        holder.titleView.setText(myCards.get(position).getTitle());
        holder.descView.setText(myCards.get(position).getInfo());

        holder.cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(holder.cv.getContext(), "Cliccked card: "+(holder.titleView.getText()), Toast.LENGTH_SHORT).show();
                Context context = v.getContext();

                Intent i = new Intent(context,DetailsAppActivity.class);
                //First Convert Image into Byte Array
                // and then pass into Intent and in next activity
                // get byte array from Bundle and Convert into Image(Bitmap) and set into ImageView
                // holder.iv.getId_ 2131296339 v.getId_ 2131296348.
                //
                int id1 = holder.iv.getId();
                int id2 = v.getId();
                int id3 = R.id.iconView;
                System.out.println("id1_ "+id1);
                System.out.println("id2_ "+id2);
                System.out.println("id3_ "+id3);

                Bitmap btm = BitmapFactory.decodeResource(v.getResources(),id1);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                System.out.println("bitmap is null ? "+(btm==null));
                btm.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] byteArray = stream.toByteArray();

                i.putExtra("title", ""+holder.titleView.getText());
                i.putExtra("title", ""+holder.titleView.getText());
                i.putExtra("icon",byteArray);

                context.startActivity(i);

            }
        });
    }

我想将三个日期传递给我的 DetailsActivity,但出现以下错误:

    id1_ 2131296339
    id2_ 2131296348
    id3_ 2131296339
    bitmap is null ? true
E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: com.salvatorefiorilla.systemmonitor, PID: 6151
                      java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference
                          at com.salvatorefiorilla.systemmonitor.AdapterForCard$1.onClick(AdapterForCard.java:90)
                          at android.view.View.performClick(View.java:4785)
                          at android.view.View$PerformClick.run(View.java:19858)
                          at android.os.Handler.handleCallback(Handler.java:739)
                          at android.os.Handler.dispatchMessage(Handler.java:95)
                          at android.os.Looper.loop(Looper.java:155)
                          at android.app.ActivityThread.main(ActivityThread.java:5696)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:372)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

如何正确设置id?

标签: javaandroid

解决方案


更新 2

正如您所说,您没有资源ID。您有应用程序包,并且必须获取应用程序图标,因此您可以传递该应用程序的包名称。在下一个活动中,只需获取应用程序图标。

重要编辑

我没有注意到您使用的是Drawable对象而不是使用 int id。无需在 List 中存储可绘制对象。所以请执行以下操作。

  • 首先将类型更改iconint(资源 ID)。

list.setIconId(R.drawable.ic_launcher)

BitmapFactory.decodeResource(getResources(), myCards.get(position).getIconId());

  • 通过以下方法设置 ImageView 图像。
  • 旧的解决方案也被编辑了。

holder.iv.setImageResource(myCards.get(position).getIconId());

解决方案

只需holder.iv.getId();更改myCards.get(position).getIconId()

Bitmap btm = BitmapFactory.decodeResource(v.getResources(),myCards.get(position).getIconId());

坠机原因

因为holder.iv.getId()返回你的ImageViewid不是可绘制的资源 id。

建议(必须使用)

传递资源 id 而不是传递位图数组。无需传递位图的字节数组。

i.putExtra("icon",myCards.get(position).getIconId());

在下一个活动中

imageView.setImageResource(getIntent().getIntExtra("icon",0));

是不是很简单:)


推荐阅读