2012-06-07 15 views
5

Bueno, básicamente, presiono un botón, esto abre la aplicación de cámara predeterminada usando la intención de la cámara. Después de tomar una fotografía, se guardarán las cosas necesarias y se redireccionará a otra actividad.Reinicio de la actividad de Android después de tomar una foto (¿orientación?)

En esta actividad, tengo una AsyncTask que puede cargar imágenes con éxito. Entonces, ¿cuál es mi problema? Puedes preguntar. Mi problema es que recrea mi actividad y, por lo tanto, restablezco mi ProgressDialog junto con ella. (Ejecuta la actividad, la aSyncTask, muere antes de que pueda finalizarla y vuelve a crear mi actividad para realizar la asynctask una vez más).

No siempre lo hace. Creo que hace esto porque cambia la Orientación del teléfono de Horizontal a Vertical. (Tengo un Samsung Cuando voy a la cámara cambia a horizontal y cuando lo termine, que se remonta a vertical..)

ya he hecho mis deberes y añadió estas cosas a mi manifiesta:

android:configChanges="orientation|keyboardHidden" 
android:screenOrientation="portrait" > 

Me aseguré de "bloquear" mi aplicación con orientación vertical, pero aún veo que mi aplicación cambia de orientación y creo que esta es la razón por la que mi actividad se vuelve a crear.

Estaba planeando agregar todo tipo de comprobaciones, pero creo que esta no es la forma correcta de manejar esta situación, ya que a veces no vuelve a crear la actividad.

La comprobación de que estoy hablando es el uso de:

protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("started", "1"); 
} 

De todos modos, ¿alguien puede ayudarme? Solo quiero que cargue la actividad sin que se autodestruya.

PD: La VM no tiene ningún problema. La VM carga la actividad y la finaliza sin volver a crearla.

PPS: Realicé pruebas adicionales, en mi Samsung si lo mantengo en modo paisaje, funcionará. Definitivamente es la cámara la que está destruyendo mi actividad con su cambio de orientación.

+0

el mismo problema que me pasa, así .. ¿ha encontrado la solución .. si es así por favor, puesto ... que será realmente útil – GoCrazy

+0

¿tiene un diseño diseñado para el paisaje? layout-land? – Ramz

+0

Hola, ¿encontró alguna solución :( –

Respuesta

0

intente crear una actividad fragmento de manejar mostrar y actualizar el diálogo

En la actividad fragmento de progreso asegurarse y ajuste "setRetainInstance (true);" Esto asegurará que no se destruya cuando se crea/destruye la actividad principal.

Probablemente sea una buena idea colocar todo el proceso de captura de imágenes dentro de este fragmento, incluida la asynctask. Asegúrese de no hacer referencia al contexto de la actividad principal dentro de doInBackground() en AsyncTask. Si haces esto y la orientación cambia (es decir, se destruye la actividad) arrojará un error.

aquí hay un ejemplo aproximado:

public class MyFragment extends FragmentActivity { 

    private ProgressBar mProgressBar; 
    private boolean mAsyncTaskActive = false; 


    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setRetainInstance(true); 

     // grab reference to progress bar 
     mProgressBar = (ProgressBar) getActivity().findViewById(R.id.my_progress_bar); 


     // check to see if the async task is active and set the progress bar visibility accordingly 
     if (mAsyncTaskActive) { 
      mProgressBar.setVisibility(View.VISIBLE); 
      mProgressBarText.setVisibility(View.VISIBLE); 
     } 


    } 

    // this method is called from your main activity when the user does something (i.e. clicks a button) 
    // make sure you have already instantiated the fragment 

    public void startSomething() { 
     if (mAsyncTaskActive == false) { 
      mProgressBar.setVisibility(View.VISIBLE); 
      new MyAsyncTask().execute(); 
      mAsyncTaskActive = true; 
     } 
    } 

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
     Context applicationContext; 



     @Override 
     protected Void doInBackground(String... params) { 
      // do stuff 
      publishProgress(//some number); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
     } 



} 

También debería echar un vistazo a cómo implementar fragmentos si no estás familiarizado. El blog de desarrollo de Android tiene una buena publicación en DialogFragments, los mismos principios.http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

+0

@Yihka responde esto a su pregunta? – Aaron

8

Tuve el mismo problema, resulta que también necesita escuchar los cambios de tamaño de pantalla en el nivel API 13 o superior como se explica aquí; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize" 
1

Por esta para fijar, tuve que usar siguiente en mi archivo de manifiesto:

android:screenOrientation="portrait"  
android:launchMode="singleTop"  
android:configChanges="keyboardHidden|orientation|screenSize" 
Cuestiones relacionadas