2010-12-16 12 views
17

Ich benutze eine Fotoauswahl Absicht, ein Bild zu wählen und es in eine Anwendung-private Datei zu schreiben. Der Großteil meines wichtigen Quellcodes ist unten abgebildet. Sobald ich einen Knopf drücke und die erste Bildauswahl abschließe, aktualisiert es erfolgreich die Bildansicht. Sobald ich jedoch die Bildauswahlschaltfläche erneut drücke (in derselben Aktivität), wird die Bildansicht NICHT aktualisiert, es sei denn, ich beende die Aktivität und starte sie neu. Ich weiß also, dass das Image erfolgreich gespeichert wird, aber warum sollte ImageView im Layout nicht aktualisiert oder aktualisiert werden?ImageView nicht aktualisieren/Änderungen widerspiegeln

nach Aktivitätsergebnis, legte ich die Bild-URI ImageView auf diese Datei.

Wenn dies abgeschlossen ist, ändert sich ImageView entsprechend. Wenn ich jedoch versuche, das Bild erneut auszuwählen (gleiche Aktivität), wird ImageView erst aktualisiert, wenn ich die Aktivität verlasse und erneut eingabe. Ich bin mir nicht sicher, warum das passiert, ist es, weil ich versuche, jedes Mal auf das temp.jpg zu schreiben? Oder muss ich mein Layout irgendwie aktualisieren, um Änderungen in ImageView zu berücksichtigen?

+0

Gibt es Code fehlt? Von dem, was Sie geschrieben haben, sollte es nicht erforderlich sein, Ausgabeströme für das ausgewählte Bild zu öffnen. –

+0

Ich habe einen Großteil meines Quellcodes hinzugefügt. Ich finde auch, dass die Bildansicht erfolgreich aktualisiert wird, wenn ich den Wert nur aus der Absicht als Bitmap zurückgebe. Ich möchte jedoch immer noch die Ursache des Problems wissen. – damonkashu

+0

Also gibt es etwas, was ich nicht über ImageViews oder die Bildauswahl intent weiß? etwas, das die Änderung nicht widerspiegelt, bis die Aktivität neu gestartet wird? – damonkashu

Antwort

1

zu zwingen, um das Widget neu gezeichnet/Blick rufen Sie einfach View.invalidate();

+3

Ich rufe dies auf der ImageView, und es scheint nichts zu tun – damonkashu

+1

Ich habe das gleiche Problem hier. Invalidate aktualisiert meine benutzerdefinierte Bildansicht nicht –

18

Gemessen an der Image Quellcode, wird das Image nicht das Bild neu zu laden, wenn Sie setImageURI mit den gleichen URI aufruf. Sie können versuchen, den URI zu ändern, indem Sie Ihr Bild in eine andere Datei schreiben.

+4

Vielen Dank! Ich habe zu viele Stunden damit verbracht, das herauszufinden. Nachdem ich selbst die Quelle angeschaut und view.requestLayout() und view.invalidate() ausprobiert habe, die nicht funktioniert haben, bin ich zu dem Schluss gekommen, dass das Setzen von uri auf null vor dem erneuten Setzen die beste, wenn nicht die einzige Möglichkeit ist, setImageUri zu verwenden für eine einzelne Bilddatei ändern. –

+3

Danke euch beiden dafür. Es hat mir nur einige Stunden Verwirrung in Bezug auf die ImageView-Aktualisierung erspart. In meinem Fall wollte ich eine Bildaktualisierung bei der Gebietsschemaaktualisierung, aber anscheinend scheint es, da die resId sich nicht ändert, die ImageView ignoriert nur Ihre Anfrage, nicht zu überprüfen, ob die Ressource selbst geändert hat. Habe einfach eine setImageDrawable (null) gefolgt von der regulären setImageResource (R.drawable.image) und es funktioniert. Muss eine Implementierungswahl für Leistungszwecke gewesen sein. – Toryu

+0

Danke @ Pilot_51 und Toryu ... Das imageDrawable auf null zu setzen und danach das ImageURi zu setzen, hat auch für mich funktioniert. – Akshat

1

Ich hatte ein ähnliches Problem, wo ich die Geräte Kamera verwendet, um ein Bild zu machen und dann wollte die ImageView auf dem ursprünglichen Bildschirm aktualisieren, wenn ich zu ihm zurückkehrte. Die Lösung war, View.invalidate() in onResume() aufzurufen.

11

ImageView wird nicht neu gezeichnet, wenn der "neue" URI derselbe wie der alte ist. "View.invalidate()" funktioniert nicht. Um das Update zu "erzwingen", können Sie Folgendes tun:

public void onResume() { 
    super.onResume(); 
    ImageView myImageView = (ImageView)findViewById(R.id.contact_image); 
    if (hasImage) { 
    myImageView.setImageDrawable(null); // <--- added to force redraw of ImageView 
    myImageView.setImageURI(Uri.fromFile(getFileStreamPath(TEMP_PHOTO_FILE))); 
    } 
} 
3

invalidate() nicht funktioniert. Versuchen Sie, Hack:

imageView.setImageURI(null); 
    imageView.setImageURI(newUri); 
Verwandte Themen