Comment garder une image dans un Android de l'activité lors d'un changement d'orientation?
Je suis très nouveau pour Android programmation et ont fait des expériences avec la création d'une application. Dans mon application j'ai l'utilisateur d'appuyer sur un bouton qui permet de choisir une application sur leur appareil, telles que la "Galerie" pour sélectionner une image. Cette image est alors affichée dans une imageview fenêtre sur l'écran de l'activité. Malheureusement, lorsque j'allume mon téléphone et les changements d'orientation, l'image est perdue et qu'ils doivent aller le sélectionner à nouveau.
Comment puis-je enregistrer l'image bitmap et qu'il re-affiche après le changement d'orientation?
Voici le code de la fonction que j'utilise pour permettre à l'utilisateur de choisir une image app, choisissez une image et afficher l'image dans l'imageview fenêtre.
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){
Uri targetUri = data.getData();
textTargetUri.setText(targetUri.toString());
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
targetImage.setImageBitmap(bitmap);
}
catch (FileNotFoundException e){
e.printStackTrace();
}
}
}
La fonction ci-dessus est initialisé dans mon onCreate en réponse à un clic sur un bouton indiqué dans ce code:
Button buttonLoadImage = (Button)findViewById(R.id.loadimage);
textTargetUri = (TextView)findViewById(R.id.targeturi);
targetImage = (ImageView)findViewById(R.id.targetimage);
buttonLoadImage.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);
}});
Essentiellement, j'ai juste besoin de mettre cette valeur dans mon onCreate et de l'avoir mis l'image dans la fenêtre. Il affiche également un texte qui indique où l'image a été situé sur le périphérique, mais qui n'est pas aussi important pour moi que d'être en mesure d'avoir l'image reste à l'écran.
if (savedInstanceState != null) {
}
Mais il semble effacer les données après le changement d'orientation?
Je n'ai aucune idée de comment faire pour enregistrer les données et de les restaurer à être utilisée dans ce type boolean.
J'apprécie tous les conseils, code, ou des liens que vous pouvez offrir!
Mise à JOUR:
Merci Vishal Vijay et rajahsekar pour votre rapide et les réponses utiles. À l'aide de vos deux conseillé de codage ainsi que le peu de code que j'avais trouvé à partir de précédentes recherches, j'ai été en mesure de compiler une solution. Cependant, alors qu'il a résolu le premier problème, il a engendré un autre que je vais décrire, après de montrer le code que j'ai utilisé pour résoudre le problème initial.
J'ai trouvé que j'avais 2 options disponibles pour la restauration de la partie.
Soit je pouvais le mettre dans le onCreate:
if (savedInstanceState != null) {
//if there is a bundle, use the saved image resource (if one is there)
image = savedInstanceState.getParcelable("BitmapImage");
targetImage.setImageBitmap(image);
textTargetUri.setText(savedInstanceState.getString("path_to_picture"));R.drawable.camera_button);
}
Cela m'a permis d'avoir à la fois de l'image ainsi que le chemin d'accès de l'appareil, pour être affiché à nouveau sur mon activité.
Ou je pourrais avoir ce après le onCreate
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
image = savedInstanceState.getParcelable("BitmapImage");
targetImage.setImageBitmap(image);
textTargetUri.setText(savedInstanceState.getString("path_to_picture"));
}
et la fonction d'économie que j'ai utilisé était
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putParcelable("BitmapImage", bitmap);
savedInstanceState.putString("path_to_picture", picture_location);
}
De préciser où picture_location est venu, de retour dans mon onActivityResult fonction j'ai ajouté une ligne et changé les autres pour gagner de la chaîne de chemin
if (resultCode == RESULT_OK){
Uri targetUri = data.getData();
picture_location = targetUri.toString();
textTargetUri.setText(picture_location);
Comme pour les variables initialisées avant le onCreate,
Bitmap image;
Bitmap bitmap;
String picture_location;
Maintenant, je me rends compte que cela a eu assez long mais j'espère que ça aidera d'autres personnes qui ont un problème similaire. Comme pour le nouveau problème que j'ai mentionné plus tôt, quand je tourne mon appareil android, il n'en fait garder les données et les afficher à nouveau ce que j'essayais de faire. Cependant, lorsque je tourne l'écran à nouveau, l'original, le problème se pose; les données semble être perdu et n'est pas affiché sur l'écran.
J'espère qu'il est beaucoup plus simple correctif, afin que la sauvegarder et de restaurer les fonctions de continuer à travailler n'importe comment beaucoup de fois l'orientation de l'écran change?
Merci encore les gars!
OriginalL'auteur DeadJohnDoe | 2014-01-11
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Vishal Vijay
Je pense que ça coûte trop cher si vous enregistrez un
Bitmap
dansonSaveInstanceState
,commeonSaveInstanceState
sera appelée avantonStop
à chaque fois,etBitmap
est une grande chose.Je pense que c'est mieux d'enregistrer un
URI
dansonSaveInstanceState
。OriginalL'auteur footman
Nous devrions ne jamais utiliser de la façon décrite ci-dessus pour enregistrer nos objets lourds tels que des images ou bitmap, il est toujours conseillé d'utiliser les fragments.
Jetez un oeil à ce qui en facilite la mise en œuvre de la façon de conserver le fragment https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
OriginalL'auteur cammando
selon le guide du développeur https://developer.android.com/topic/performance/graphics/cache-bitmap.html.
la méthode recommandée consiste à utiliser setRetainInstance(true) dans le fragment de conserver les images.
reportez-vous à la section "Gérer les Changements de Configuration"
OriginalL'auteur Angel Koh
Utilisation onSaveInstanceState pour enregistrer l'image
OriginalL'auteur rajahsekar
Ajouter
android:configChanges="keyboardHidden|orientation"
pour votre Activité dans le fichier de Manifeste.J'avais trouvé votre réponse comme une "solution" auparavant, il ne fonctionne malheureusement pas. Au moins, pas avec mon programme.
OriginalL'auteur Manali Sheth