Establecer vista de imagen después del cambio de orientación

Tengo el código siguiente, que está trabajando perfectamente bien hasta que giro mi teléfono. Entonces tengo que hacer clic de nuevo para cargar una imagen, entiendo que cuando giramos la actividad se reinicia y tenemos algunos métodos para almacenar el estado y restaurarlo, pero en mi caso como se puede ver que el archivo img está en una cadena como Se genera al azar. Entonces, ¿cómo puedo hacer uso de onConfigurationChanged (que parece fácil de entender) para restaurar la imagen anterior antes de la rotación?

public class HomeScreen extends Activity { protected ImageView imgView; protected String str; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home_screen); final Random rnd = new Random(); ActionBar actionBar = getActionBar(); actionBar.hide(); imgView = (ImageView) findViewById(R.id.imgRandom); if (savedInstanceState != null) { str = savedInstanceState.getString("param"); imgView.setImageDrawable ( getResources().getDrawable(getResourceID(str, "drawable", getApplicationContext())) ); imgView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // final ImageView img = (ImageView) findViewById(R.id.imgRandom); // I have 3 images named img_0 to img_2, so... str = "img" + rnd.nextInt(9); imgView.setImageDrawable ( getResources().getDrawable(getResourceID(str, "drawable", getApplicationContext()))); } }); } } protected void onSaveInstanceState(Bundle savedInstanceStat) { super.onSaveInstanceState(savedInstanceStat); savedInstanceStat.putString("param", str); } 

Cuando hago girar, se está estrellando y también en carga O en el botón No hay imágenes cargando.

 > 07-07 21:11:32.950: I/InputReader(468): Device reconfigured: id=1, > name='Genymotion Virtual Input', size 1080x1920, orientation 0, mode > 1, display id 0 07-07 21:11:32.950: I/ActivityManager(468): Config > changes=480 {1.0 310mcc260mnc en_US ?layoutDir sw360dp w360dp h567dp > 480dpi nrml port finger qwerty/v/v dpad/v s.14} 07-07 21:11:33.081: > W/ResourceType(1861): Too many attribute references, stopped at: > 0x01010034 07-07 21:11:33.081: W/ResourceType(1861): Too many > attribute references, stopped at: 0x01010034 07-07 21:11:33.082: > D/AndroidRuntime(1861): Shutting down VM 07-07 21:11:33.083: > E/AndroidRuntime(1861): FATAL EXCEPTION: main 07-07 21:11:33.083: > E/AndroidRuntime(1861): Process: > app.motivation.techiequickie.ypb.motivation, PID: 1861 07-07 > 21:11:33.083: E/AndroidRuntime(1861): java.lang.RuntimeException: > Unable to start activity > ComponentInfo{app.motivation.techiequickie.ypb.motivation/app.motivation.techiequickie.ypb.motivation.HomeScreen}: > java.lang.NullPointerException: name is null 07-07 21:11:33.083: > E/AndroidRuntime(1861): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.app.ActivityThread.access$900(ActivityThread.java:151) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): at > android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.os.Handler.dispatchMessage(Handler.java:102) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): at > android.os.Looper.loop(Looper.java:135) 07-07 21:11:33.083: > E/AndroidRuntime(1861): at > android.app.ActivityThread.main(ActivityThread.java:5254) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): at > java.lang.reflect.Method.invoke(Native Method) 07-07 21:11:33.083: > E/AndroidRuntime(1861): at > java.lang.reflect.Method.invoke(Method.java:372) 07-07 21:11:33.083: > E/AndroidRuntime(1861): at > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): Caused by: > java.lang.NullPointerException: name is null 07-07 21:11:33.083: > E/AndroidRuntime(1861): at > android.content.res.Resources.getIdentifier(Resources.java:2034) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): at > app.motivation.techiequickie.ypb.motivation.HomeScreen.getResourceID(HomeScreen.java:148) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > app.motivation.techiequickie.ypb.motivation.HomeScreen.onCreate(HomeScreen.java:35) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.app.Activity.performCreate(Activity.java:5990) 07-07 > 21:11:33.083: E/AndroidRuntime(1861): at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) > 07-07 21:11:33.083: E/AndroidRuntime(1861): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) > 07-07 21:11:33.083: E/AndroidRuntime(1861): ... 11 more 07-07 > 21:11:33.084: W/ActivityManager(468): Force finishing activity 1 > app.motivation.techiequickie.ypb.motivation/.HomeScreen 

Parece que el principal problema es que su llamada a imgView.setOnClickListener() fue anidada dentro de su if (savedInstanceState != null) .

Conseguí su código trabajando un-nesting el oyente del tecleo, y añadiendo un guión bajo al nombre del recurso a buscar. Utilicé nueve imágenes, nombradas img_0.png través de img_8.png y luego img_8.png en la carpeta drawable .

También agregué el código que carga una imagen al azar en el arranque.

Después de que se carga con éxito otra imagen aleatoria en el clic. También probé la rotación de la pantalla, y su código existente funciona muy bien, mantuvo la imagen actual presente no importa cuántas veces giré la pantalla.

Aquí está el código totalmente funcional y probado:

 public class HomeScreen extends Activity { protected ImageView imgView; protected String str; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home_screen); final Random rnd = new Random(); //ActionBar actionBar = getActionBar(); //actionBar.hide(); imgView = (ImageView) findViewById(R.id.imgRandom); if (savedInstanceState != null) { str = savedInstanceState.getString("param"); Log.d("image screen rotation", str); imgView.setImageDrawable ( getResources() .getDrawable(getResourceID(str, "drawable", getApplicationContext())) ); } else{ str = "img_" + rnd.nextInt(9); Log.d("image startup", str); imgView.setImageDrawable( getResources() .getDrawable(getResourceID(str, "drawable", getApplicationContext()))); } imgView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // final ImageView img = (ImageView) findViewById(R.id.imgRandom); // I have 3 images named img_0 to img_2, so... str = "img_" + rnd.nextInt(9); Log.d("image click", str); imgView.setImageDrawable( getResources() .getDrawable(getResourceID(str, "drawable", getApplicationContext()))); } }); } protected final static int getResourceID (final String resName, final String resType, final Context ctx) { final int ResourceID = ctx.getResources().getIdentifier(resName, resType, ctx.getApplicationInfo().packageName); if (ResourceID == 0) { throw new IllegalArgumentException ( "No resource string found with name " + resName ); } else { return ResourceID; } } @Override protected void onSaveInstanceState(Bundle savedInstanceStat) { super.onSaveInstanceState(savedInstanceStat); savedInstanceStat.putString("param", str); } } 

Logs resultantes de ejecutar la aplicación, haga clic en el ImageView para cambiar la imagen y, a continuación, girar la pantalla:

  D/image startup﹕ img_8 D/image screen rotation﹕ img_8 D/image screen rotation﹕ img_8 D/image click﹕ img_3 D/image screen rotation﹕ img_3 D/image screen rotation﹕ img_3 D/image screen rotation﹕ img_3 D/image screen rotation﹕ img_3 D/image click﹕ img_7 D/image screen rotation﹕ img_7 D/image screen rotation﹕ img_7 D/image screen rotation﹕ img_7 D/image screen rotation﹕ img_7 D/image screen rotation﹕ img_7 D/image screen rotation﹕ img_7 
  1. Crear dos variables de nivel de clase para almacenar el número aleatorio actual y almacenar el estado de la imagen, por ejemplo: – IsImageDownloaded (Boolean)
  2. OnInstanceSave() método OnInstanceSave() y capture el número aleatorio actual y el estado de la imagen.
  3. (Al girar el dispositivo se onCreate() nuevo) En onCreate() compruebe si isImageDownloaded true o false (If condition). Si es cierto, entonces obtenga el número aleatorio capturado y vuelva a mostrar la imagen utilizando este número aleatorio.
  4. Puede crear un método separado para cargar la imagen de un número aleatorio específico y puede utilizar este método en método onClick() y también en la condición if .

Usa esto en tu manifiesto.

  <activity android:name="youractivity" android:configChanges="keyboardHidden|screenSize|orientation" > </activity> 

Esto manejará el cambio de orientación por sí mismo. Y quitar la codificación savedInstance

Simplemente puede almacenar la imagen en su local primero y luego sólo obtener esta imagen y establecer en el momento de rotación o bien. Esto también aumentará el tiempo de aplicación de ur para la imagen de carga

  • Cómo rotar la imagen en imageview en el botón haga clic en cada vez?
  • Java Android ¿cómo puedo hacer que ImageView sea más oscuro onClick
  • Android, Java, Creación de una miniatura que mantiene la relación de aspecto
  • Mostrar la imagen de réplica con imagen especular en android
  • Cómo recortar Bitmap Center like imageview?
  • El selector no funciona con el diseño y la vista de imagen
  • Crear diseño de las imágenes sin asignarlas layoutparams estáticos en android
  • Android imageview toma espacio extra negro
  • Android ImageView no está mostrando la imagen?
  • Ocultar y eliminar la imagen en la vista de imagen de Android
  • SetImageBitmap no tiene efecto visible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.