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.
- ¿Cómo mostrar una imagen de blob en Android?
- Hacer una imagen a pantalla completa en la aplicación de tutorial para Android
- Cambiar el tamaño de ImageView para ajustarse a la relación de aspecto
- Fuera de la memoria de carga imageViews
- Cómo poner vistas en la parte superior de un ImageView, en relación con el tamaño del contenido de ImageView?
> 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
- Android ¿Arrastrar y soltar imágenes en la pantalla?
- Ampliación de ImageView TOP_CROP
- Cómo configurar BackgroundColor en ImageView en Android?
- Escala de ImageView al ancho del dispositivo
- Cómo crear una imagen giratoria controlada por gestos para una interfaz de usuario
- Bitmap demasiado grande para ser cargado en una textura en algunos teléfonos
- Android - ViewRootImpl $ CalledFromWrongThreadException
- El video no se detiene en el fragmento ViewPager
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
- 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) -
OnInstanceSave()
métodoOnInstanceSave()
y capture el número aleatorio actual y el estado de la imagen. - (Al girar el dispositivo se
onCreate()
nuevo) EnonCreate()
compruebe siisImageDownloaded
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. - 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ónif
.
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
- Widget que llama a la aplicación de reconocimiento de voz
- La manera más rápida y eficiente de pre-poblar la base de datos en Android