2012-06-07 9 views
5

Po naciśnięciu przycisku otwiera się domyślna aplikacja aparatu za pomocą kamery. Po zrobieniu zdjęcia zapisze potrzebne rzeczy i przekieruje do innej czynności.Resetowanie aktywności Androida po zrobieniu zdjęcia (orientacja?)

W tym ćwiczeniu mam AsyncTask, który może z powodzeniem przesłać zdjęcia. Więc jaki jest mój problem, możesz zapytać. Mój problem polega na tym, że odtwarza on moją aktywność i dlatego resetuję mój ProgressDialog razem z nim. (Działa ona, aSyncTask, umiera, zanim może ją zakończyć i ponownie tworzy moją Aktywność, aby ponownie wykonać asynktask).

Nie zawsze to robi. Myślę, że robi to, ponieważ zmienia Orientację z telefonu z Pejzażu na Portret. (Mam Samsung Kiedy idę do kamery zmienia się krajobraz i kiedy skończyć, to wraca do portretu.).

już robiłem moją pracę domową i dodał te rzeczy do mojego manifestu:

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

Dopilnowałem, aby "zablokować" moją aplikację w orientacji pionowej, ale wciąż widzę zmianę orientacji mojej aplikacji i uważam, że właśnie dlatego moja aktywność zostaje ponownie utworzona.

Zamierzałem dodać wszystkie rodzaje kontroli, ale uważam, że nie jest to właściwy sposób poradzenia sobie z tą sytuacją, ponieważ czasami nie odtwarza się jej ponownie.

Kontrola mówię jest użycie:

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

Zresztą, może ktoś mi pomóc? Po prostu chcę, żeby załadowała działalność bez samozniszczenia mnie.

PS: Maszyna wirtualna nie ma żadnych problemów. Maszyna wirtualna ładuje działanie i kończy je bez ponownego tworzenia.

PPS: Czy dodatkowe testy, na moim Samsungie, jeśli trzymam go w trybie krajobrazowym, zadziała. Jest to zdecydowanie kamera, która niszczy moją aktywność dzięki zmianie orientacji.

+0

ten sam problem ze mną dzieje, jak dobrze .. masz znalazł rozwiązanie .. jeśli tak proszę umieszczać to ... to będzie naprawdę pomocne – GoCrazy

+0

czy masz układ zaprojektowany dla krajobrazu? layout-land? – Ramz

+0

Witam, czy znalazłeś jakieś rozwiązanie :( –

Odpowiedz

0

Spróbuj utworzyć aktywność fragment obsłużyć wyświetlanie i aktualizowanie postępu dialogowe

W działalności fragmentu upewnić i ustaw „setRetainInstance (true);” Dzięki temu nie zostanie zniszczona, gdy główne działanie zostanie utworzone/zniszczone.

To chyba dobry pomysł, aby umieścić cały proces przechwytywania obrazu wewnątrz tego fragmentu, w tym asynktaksu. Upewnij się, że nie odwołujesz się do kontekstu działania nadrzędnego z poziomu doInBackground() w AsyncTask. Jeśli to zrobisz, a zmiany orientacji (to znaczy, że działanie zostanie zniszczone), spowoduje to błąd.

oto szorstki przykład:

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



} 

Należy również przyjrzeć się, jak zaimplementować fragmenty, jeśli nie jesteś już zaznajomiony. Blog programisty Androida ma dobry post na temat DialogFragmentów, tych samych zasad.http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

+0

@Yihka robi tę odpowiedź na twoje pytanie? – Aaron

8

Miałem ten sam problem, okazało się, że musisz również słuchać zmian wielkości ekranu na poziomie interfejsu API 13 lub wyższym, zgodnie z wyjaśnieniem tutaj; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize" 
1

Aby to naprawić, musiałem użyć następujących w moim pliku manifestu:

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