現在、私のプロジェクトには、それぞれの下に画像と説明があるGridViewがあります。画像をクリックすると、その画像の下に完全な画像と説明が表示された新しいアクティビティで開きます。GridView - 新しいアクティビティの画像を開く
現在、エミュレータで正常に動作していますが、実際のデバイスではonclickは何もしません。
MainActivityでintent.putExtra("image", item.getImage())
をintent.putExtra("image", bitmap)
に変更すると、新しい2次DetailsActivityが開きますが、画像ではなくテキストのみが表示されます。 Logcatはこの変更のエラーを表示せず、 "java.lang.Integerをandroid.os.Parcelableにキャストできません"ということだけを示します。
MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = (GridView) findViewById(R.id.gridView);
gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
gridView.setAdapter(gridAdapter);
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
ImageItem item = (ImageItem) parent.getItemAtPosition(position);
Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
intent.putExtra("title", item.getTitle());
intent.putExtra("image", item.getImage());
startActivity(intent);
}
});
}
private ArrayList<ImageItem> getData() {
final ArrayList imageItems = new ArrayList();
String[] itemsArray = getResources().getStringArray(R.array.grid_ids);
TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
for (int i = 0; i < imgs.length(); i++) {
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), imgs.getResourceId(i, -1));
imageItems.add(new ImageItem(bitmap, itemsArray[i]));
}
return imageItems;
}
DetailsActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
Intent intent = getIntent();
String title = getIntent().getStringExtra("title");
Bitmap image = getIntent().getParcelableExtra("image");
TextView titleTextView = (TextView) findViewById(R.id.title);
titleTextView.setText(title);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageBitmap(image);
にImageItemクラス:
public class ImageItem {
public Bitmap image;
public String title;
public ImageItem(Bitmap image, String title) {
super();
this.image = image;
this.title = title;
}
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
GridViewAdapter:
public class GridViewAdapter extends ArrayAdapter<ImageItem> {
private Context context;
private int layoutResourceId;
private ImageView imageView;
private ArrayList<ImageItem> data = new ArrayList<ImageItem>();
public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.image = (ImageView) row.findViewById(R.id.image);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
ImageItem item = data.get(position);
holder.imageTitle.setText(item.getTitle());
holder.image.setImageBitmap(item.getImage());
return row;
}
static class ViewHolder {
TextView imageTitle;
ImageView image;
}
イメージ(R.drawable内)と説明は、strings.xmlの2つの文字列配列でリストされています。
私は、コードの最初の提案行を追加しようとしましたしかし、それは私に 'ImageItem'メソッドの最初のパラメータを 'Bitmap'から 'Int'に変更するか、 'Constructorを作成する'にオプションを与えます - コンストラクタを作成すると、ImageItem.java(public ImageItem(int resourceId、文字列タイトル){})。私はresourceIdとStringのタイトルを記述する必要がありますか? 2行目のコードをGridViewAdapterにコピーすると、imgsは赤色になり、オプション - ローカル変数 'imgs'を作成し、フィールド 'imgs'を作成し、パラメータ 'images'を作成するか、リファレンスの名前を変更しますか? – Subject
3行目のコードでは、imageViewが赤色になり、オプションがローカル変数を作成し、ImageViewイメージビューをスコープに持ち込み、フィールドを作成し、パラメータを作成し、参照名を変更します。私はプログラミングの初心者で、これを正しく正しく適用する方法はまだ分かりません。私はまだ動作しないコードを取得しています。ありがとう。 – Subject
こんにちは、前回の回答の後に更新された回答を投稿してコメントに返信しました。それはタイトル「更新された回答」の下に掲載されます。答えを確認し、それがあなたのために働いたことを教えてください。 –