因此,张贴者(最初)并没有明确指定是否在点击时立即打开其他活动,或者是否只需要记录点击项目的图像以供以后使用。第一个问题对我来说似乎更常见,因为GridView
它显示了一组图像缩略图。用户点击它,就会出现一个只显示该项目信息的新活动。该缩略图可能会全屏显示。无论如何,也许这不是发帖人的想法,但这是我的假设(可能有人最终会在考虑到这样一个用例的情况下找到这个答案)。
它也没有指定图像的存储方式,所以我会假设
- 的
ImageAdapter
图像是这个应用程序的捆绑资源
- 我们可以对
ImageAdapter
, 存储一些数据来解决这个问题
因此,我采用一个标准,并在 ImageView 的属性ImageAdapter
中添加一行代码来记录每个 ImageView 的整数资源 ID 。tag
有很多方法可以做到这一点,但这是我选择的方式。
public class ImageAdapter extends BaseAdapter {
/* see code removed at
http://developer.android.com/resources/tutorials/views/hello-gridview.html
*/
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
// here we record the resource id of the image, for easy access later
imageView.setTag(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3,
R.drawable.pic4,
R.drawable.pic5
};
}
然后,当 Hello 活动单击了一个网格项目时,我检索图像的资源 id 并将其作为Intent
额外的 (HelloGridViewActivity.java) 传递:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridview);
// Instance of ImageAdapter Class
gridView.setAdapter(new ImageAdapter(this));
final Context activity = this;
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Object tag = v.getTag();
if (tag instanceof Integer) {
// we stored a reference to the thumbnail image in the ImageView's tag property
Intent i = new Intent(activity, AnotherActivity.class);
Integer resourceId = (Integer)tag;
i.putExtra("backgroundImage", resourceId);
startActivity(i);
}
}
});
}
最后,当新活动(AnotherActivity
)打开时,我们额外检索该意图,并将其解码为整数资源 id,并将其设置为全屏背景图像ImageView
(AnotherActivity.java):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.another);
Intent i = getIntent();
//String bgImage = i.getExtras().getString("backgroundImage");
int resId = i.getExtras().getInt("backgroundImage");
try {
ImageView background = (ImageView) findViewById(R.id.bgImage);
// Another alternative, if the intent extra stored the resource 'name',
// and not the integer resource id
//Class<?> c = R.drawable.class;
//background.setImageResource(c.getDeclaredField(bgImage).getInt(c));
background.setImageResource(resId);
} catch (Exception e) {
e.printStackTrace();
}
}
我还在上面显示了一些注释掉的代码,如果由于某种原因您需要传递图像资源的字符串名称,而不是整数资源代码。注释掉的代码会查找给定图像名称的资源 id。根据我的 ImageAdapter 中使用的资源名称,要传递的示例字符串名称可能是"pic1"
. 如果这样做,当然,调用 Activity (HelloGridViewActivity) 需要将 Intent extra 编码为字符串,而不是整数。