2016-03-28 33 views
2

Ich habe eine DetailsActivity, die mehrere Miniaturansichten von Bildern auflistet. Ich möchte eine neue Aktivität öffnen, indem ich die URL als Zeichenfolge an einen "FullScreenActivity" übergibt, der es dem Benutzer ermöglicht, die größere Version des Bilds anzuzeigen. Die DetailsActivity enthält ein komplexes Datenobjekt, das ich nicht verlieren möchte, wenn der Benutzer die Vollbildansicht öffnet.Öffnen Sie neue Aktivität, ohne die übergeordnete Aktivität zu verlieren

ich die Zeichenfolge an den neuen „FullScreenActivity“ passieren kann, die Bild-Downloads, und ich kann die Bilder etc kneifen/vergrößern .. aber wenn ich die Taste UP auf die jeweiligen DetailsAcitivity zurückzukehren, Die App stürzt ab, weil das komplexe Datenobjekt verschwunden ist. Wie behalte ich die DetailsActivity um, während der Benutzer ein größeres Bild betrachtet

So nenne ich die FullScreenActivity. Dies wird in einer for-Schleife aufgerufen, die eine neue Bildansicht erstellt und sie zur Aktivität hinzufügt.

image.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
Intent intent = new Intent(DetailsActivity.this, ViewFullPhotoActivity.class); 
intent.putExtra("FullScreenPicture", (String) finalImageMap.get("MainImage")); 
startActivity(intent); 
} 
}); 

Und in meinem FullScreenActivity, erhalte ich die URL-Zeichenfolge über

String fullScreenImage = (String) getIntent().getCharSequenceExtra("FullScreenPicture"); 

ich mit der Idee der Verpackung, um das komplexen Datenobjekts geliebäugelt und es zusammen mit der neuen Absicht zu senden, aber sicher Das ist keine bewährte Methode. Es gibt andere Dinge, die für den Benutzer nicht toll wären, wenn ich diesen Pfad gehen würde, insbesondere das erneute Herunterladen aller Miniaturansichten oder das Verlieren von Daten, die in ein Formular eingegeben wurden.

+0

Können Sie bitte das Logcat bereitstellen, wenn Ihre App abstürzt? So können wir die Ursache untersuchen. – ljpv14

+0

Das Crash-Protokoll ist das komplexe Objekt ist null. –

Antwort

1

Ich würde vorschlagen, zu überschreiben onSaveInstanceState(), speichern Sie Ihre Daten dort und innerhalb onCreate() erhalten Sie Ihre gespeicherten Daten von savedInstanceState. Siehe die documentation für mehr.

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save your data here with savedInstanceState.put<something>... 
} 

Wenn Ihre Daten komplex ist (kein String oder int oder ein einfacher Typ), können Sie eine Methode zum Speichern an einen Bundle, und ein anderes (was im savedInstanceState Bündel gesetzt werden kann) schreiben die analysiert ein Bündel und stellt Ihre Daten wieder her. Aber es ist keine gute Idee, Bilder wie diese zu speichern ... Sie könnten sie auf SD-Karte zwischenspeichern (zB im Datenverzeichnis Ihrer App, aber nicht im Speicher).


Eine weitere Option den Inhalt Ihres "FullScreenActivity" in einem Vollbild-Dialog anstelle einer Aktivität, so dass die DetailsActivity wird nicht im Hintergrund zerstört werden, um zu zeigen.

1

Wenn Ihre komplexe Datenstruktur nicht mit onSaveInstanceState gespeichert werden kann, ist es am einfachsten, sie in einem Singleton-Objekt zu speichern und dann das komplexe Objekt im Speicher zu behalten. Sie finden ein Beispiel here.

Es ist jedoch nicht der beste Ansatz.Wenn Sie davon ausgehen, dass sich das komplexe Objekt ständig im Speicher befindet, können unerwartete Nullzeigerausnahmen auftreten. Wenn Sie weiter gehen wollen, dann können Sie entweder

  • das Objekt serialisiert und auf der Festplatte
  • Verwenden Sie eine SQLite-Datenbank speichern und in der DB speichern

ich die letzteren zwei Methoden glauben sind besser, erfordern jedoch einige wichtige Arbeit, abhängig davon, wie komplex Ihre Datenstruktur ist.

0

Dies wird ausreichen. In Ihrer Manifest-Datei.

<activity 
      android:name=".FullScreenActivity" 
      android:label="FullScreenActivity" 
      android:launchMode="singleTop" 
      android:parentActivityName=".DetailsActivity"> 

Dies wird angeben, dass Ihre Vollbild-Aktivität das Kind von DetailsActivity sein wird. Dies öffnet die Vollbild-Aktivität oberhalb von DetailsActivity.

+0

Ich denke, Sie könnten das rückwärts haben. Ich habe den LaunchMode in die Aktivität Details eingefügt und das hat funktioniert. –

+0

Sie fragte nach Kind, Eltern-Konzept mit der Aktivität, deshalb habe ich eine Lösung wie folgt hinzugefügt @ Firemarble – HourGlass

0

Ich fand eine viel einfachere Lösung. In meinem Android Manifest, in meinem DetailsActivity habe ich einfach android:launchMode="singleTop" hinzugefügt. Das hat den Trick gemacht.

Verwandte Themen