2012-06-07 14 views
5

Nun, im Grunde, drücke ich eine Taste, dies öffnet Ihre Standard-Kamera-App mit der Kamera Absicht. Nachdem ein Bild aufgenommen wurde, werden die benötigten Daten gespeichert und an eine andere Aktivität weitergeleitet.Android-Aktivität-Reset nach der Aufnahme (Ausrichtung?)

In dieser Aktivität habe ich eine AsyncTask, die Bilder erfolgreich hochladen kann. Also, was ist mein Problem, das Sie fragen können. Mein Problem ist, dass es meine Aktivität neu erstellt und daher meinen ProgressDialog zusammen mit ihm zurücksetzt. (Es läuft die Aktivität, stirbt die aSyncTask, stirbt, bevor sie es beenden kann und erstellt meine Aktivität neu, um die asynctask noch einmal auszuführen.)

Es tut dies nicht immer. Ich denke, dass es das tut, weil es die Ausrichtung vom Telefon von Landschaft zu Porträt ändert. (Ich habe einen Samsung Als ich in die Kamera gehen wechselt sie in Landschaft und wenn ich es fertig, geht es zurück zum Portrait..)

Ich habe bereits meine Hausaufgaben gemacht und fügte hinzu, diese Dinge zu meinem Manifest:

Ich habe dafür gesorgt, dass meine App im Hochformat "gesperrt" wird, aber ich sehe immer noch, dass meine App die Ausrichtung ändert und ich glaube, das ist der Grund, warum meine Aktivität neu erstellt wird.

Ich habe geplant, alle Arten von Prüfungen hinzuzufügen, aber ich glaube, das ist nicht der richtige Weg, um mit dieser Situation umzugehen, da es manchmal die Aktivität nicht neu erstellt.

Die Kontrolle über die ich spreche zu bedienen:

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

Wie dem auch sei, kann mir jemand helfen? Ich möchte nur, dass es die Aktivität lädt, ohne dass es sich selbst zerstört.

PS: Die VM hat keine Probleme. Die VM lädt die Aktivität und beendet sie, ohne sie neu zu erstellen.

PPS: Habe extra getestet, auf meinem Samsung, wenn ich es im Landscape-Modus halte, wird es funktionieren. Also ist es definitiv die Kamera, die meine Aktivität mit ihrer Orientierungsänderung zerstört.

+0

das gleiche Problem wie auch mir passiert .. haben Sie die Lösung gefunden .. wenn ja bitte posten es .. das wird wirklich hilfreich sein – GoCrazy

+0

hast du ein Layout für die Landschaft? Layout-Land? – Ramz

+0

Hallo haben Sie irgendeine Lösung gefunden :( –

Antwort

0

Versuchen Aktivität ein Fragment zu schaffen zu handhaben und die Anzeige des Fortschritts

im Fragment Aktivität sicher und stellen Dialog Aktualisierung „setRetainInstance (true);“ Dadurch wird sichergestellt, dass es nicht zerstört wird, wenn die Hauptaktivität erstellt/zerstört wird.

Es ist wahrscheinlich eine gute Idee, den gesamten Bilderfassungsprozess in dieses Fragment einzufügen, einschließlich der Asyntask. Stellen Sie sicher, dass Sie nicht innerhalb der doInBackground() in der AsyncTask auf den Kontext der übergeordneten Aktivität verweisen. Wenn Sie dies tun und sich die Ausrichtung ändert (d. H. Die Aktivität wird zerstört), wird ein Fehler ausgegeben.

hier ist ein grobes Beispiel:

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



} 

Sie sollten auch einen Blick auf, wie Fragmente zu implementieren, wenn Sie nicht bereits vertraut sind. Der Android Dev Blog hat einen guten Beitrag zu DialogFragments, gleiche Prinzipien.http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

+0

@Yihka beantwortet dies Ihre Frage? – Aaron

8

Ich hatte das gleiche Problem, stellt sich heraus, Sie müssen auch für Bildschirmgröße Änderungen in API-Ebene 13 oder höher zu hören, wie hier erläutert; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize" 
1

Für dieses Problem zu beheben, habe ich in meiner folgenden Manifest-Datei zu verwenden hatte:

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