java - 如何从视图元素中获取点击的卡片视图图像的 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?
解决方案
更新 2
正如您所说,您没有资源ID。您有应用程序包,并且必须获取应用程序图标,因此您可以传递该应用程序的包名称。在下一个活动中,只需获取应用程序图标。
重要编辑
我没有注意到您使用的是Drawable对象而不是使用 int id。无需在 List 中存储可绘制对象。所以请执行以下操作。
- 首先将类型更改
icon
为int
(资源 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()
返回你的ImageView
id不是可绘制的资源 id。
建议(必须使用)
传递资源 id 而不是传递位图数组。无需传递位图的字节数组。
i.putExtra("icon",myCards.get(position).getIconId());
在下一个活动中
imageView.setImageResource(getIntent().getIntExtra("icon",0));
是不是很简单:)
推荐阅读
- excel - 如何上传excel文件并验证列是否有效
- javascript - 如何在页面上的第 12 行中对卡片块 4 进行分页?
- json - 如何使用 jq 将子值聚合到数组中?
- apache-spark - 如何“强制”Spark 上的 Hive 使用 Map Join?
- docker - docker COPY 不在 C 盘时全部失败
- css - 如何使用带有字母间距的线性渐变?
- javascript - 为什么 1+[ ] 在 JavaScript 中返回“1”?
- java - 在安装时选择 Android 应用程序的颜色
- arrays - 冒号分隔的输出php数组
- python - 从数据框转换为文本文件不会分隔行