Derzeit hat mein Projekt eine GridView, die Bilder und eine Beschreibung unter jedem hat. Wenn Sie auf ein Bild klicken, wird es in einer neuen Aktivität mit dem vollständigen Bild und der Beschreibung darunter geöffnet.GridView - Bild in neuer Aktivität öffnen
Es funktioniert derzeit gut auf Emulator, aber der Onclick tut nichts auf dem realen Gerät.
Wenn ich in MainActivity intent.putExtra("image", item.getImage())
zu intent.putExtra("image", bitmap)
ändern, öffnet es die neue, sekundäre DetailsActivity, aber zeigt nur den Text und nicht das Bild. Logcat zeigt keine Fehler für diese Änderung, sagt nur, dass "java.lang.Integer nicht in android.os.Parcelable umgewandelt werden kann".
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 Klasse:
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;
}
Die Bilder (in R.drawable) und Beschreibungen sind in der strings.xml in zwei String-Arrays aufgeführt.
Ich habe versucht, das Hinzufügen der ersten vorgeschlagenen Codezeile aber es gibt mir Optionen, '1. Parameter der Methode' ImageItem 'von' Bitmap 'in' Int 'zu ändern ODER' Konstruktor erstellen '- Wenn ich einen Konstruktor erstelle, wird er in ImageItem.java (public ImageItem (int resourceId, String-Titel) {}). Muss ich in die resourceId und den String-Titel schreiben? Wenn Sie die zweite Codezeile in GridViewAdapter kopieren, wird imgs rot, Optionen - lokale Variable 'imgs' erstellen, Feld 'imgs' erstellen, Parameter 'Bilder' erstellen oder Verweis umbenennen? – Subject
3. Codezeile, imageView wird rot, Optionen sind lokale Variable erstellen, ImageView-Bildansicht in den Bereich bringen, Feld erstellen, Parameter erstellen, Referenz umbenennen. Ich bin ein Neuling im Programmieren und weiß nicht wirklich, wie ich das richtig anwenden soll. Ich bekomme immer noch einen Code, der nicht funktioniert. Vielen Dank. – Subject
Hallo, ich habe auf den Kommentar geantwortet, indem ich die aktualisierte Antwort nach der vorherigen Antwort gepostet habe. Es ist unter dem Titel "Aktualisierte Antwort" veröffentlicht. Bitte überprüfe die Antwort und lass mich wissen, ob es für dich funktioniert hat. –