2012-06-07 7 views
5

Fondamentalmente, premo un pulsante, questo apre l'app fotocamera predefinita utilizzando l'intento della fotocamera. Dopo aver scattato una foto, salverà le cose necessarie e reindirizzerà a un'altra attività.Ripristino attività Android dopo l'acquisizione dell'immagine (orientamento?)

In questa attività, ho un AsyncTask che può caricare le immagini con successo. Quindi qual è il mio problema che potresti chiedere. Il mio problema è che ricrea la mia attività e quindi resettare il mio ProgressDialog insieme ad esso. (Esegue l'attività, fa aSyncTask, muore prima che possa terminarlo e ricrea la mia attività per fare di nuovo asynctask.)

Non sempre lo fa. Penso che lo faccia perché cambia l'Orientamento dal telefono da Orizzontale a Verticale. (Ho un Samsung Quando vado alla Camera non si trasforma in paesaggio e quando avrò finito, esso risale al ritratto..)

Ho già fatto i compiti e ha aggiunto queste cose al mio manifesto:

Mi sono assicurato di "bloccare" la mia app nell'orientamento verticale, ma continuo a vedere l'orientamento del mio app cambiare e credo che questo sia il motivo per cui la mia attività viene ricreata.

Avevo intenzione di aggiungere tutti i tipi di assegni, ma credo che questo non sia il modo giusto per gestire questa situazione, poiché a volte non ricrea l'attività.

Il controllo di cui sto parlando è quello di utilizzare:

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

In ogni caso, qualcuno può darmi una mano? Voglio solo caricare l'attività senza che si autodistrugga.

PS: la VM non ha alcun problema. La VM carica l'attività e la termina senza ricrearla.

PPS: ha eseguito test aggiuntivi, sul mio Samsung se lo tengo in modalità orizzontale funzionerà. Quindi è sicuramente la telecamera che sta distruggendo la mia attività con il suo cambio di orientamento.

+0

lo stesso problema mi succede come pure .. hai trovato la soluzione .. se così si prega di inviare .. che sarà davvero utile – GoCrazy

+0

hai un layout progettato per il paesaggio? layout-land? – Ramz

+0

Ciao, hai trovato una soluzione :( –

risposta

0

Prova a creare un'attività frammento di gestire la visualizzazione e l'aggiornamento del dialogo

Nell'attività frammento progressi assicurati e impostare "setRetainInstance (true);" Ciò assicurerà che non venga distrutto quando l'attività principale viene creata/distrutta.

Probabilmente è una buona idea mettere l'intero processo di cattura dell'immagine all'interno di questo frammento, incluso il asynctask. Assicurati di non fare riferimento al contesto dell'attività principale da doInBackground() in AsyncTask. Se lo fai e l'orientamento cambia (ovvero l'attività viene distrutta) genererà un errore.

Ecco un esempio di massima:

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]); 
     } 



} 

si dovrebbe anche dare un'occhiata a come implementare i frammenti se non sei già familiarità. Il blog dev di Android ha un buon post su DialogFragments, gli stessi principi.http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

+0

@Yihka risponde alla tua domanda? – Aaron

8

Ho avuto lo stesso problema, risulta che è necessario anche ascoltare le modifiche alle dimensioni dello schermo in livello API 13 o superiore come spiegato qui; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize" 
1

Per questo per risolvere, ho dovuto usare in seguito nel mio file manifesto:

android:screenOrientation="portrait"  
android:launchMode="singleTop"  
android:configChanges="keyboardHidden|orientation|screenSize" 
Problemi correlati