Android: Erfassen der Rückkehr einer Aktivität

82

Ich habe eine Frage zum Starten neuer Aktivitäten. Es läuft darauf hinaus. Ich habe 3 Registerkarten in einer Ansicht

A) contains gMap activity
 B) camera activity
 C) some random text fields.

Voraussetzung ist, dass die Anwendung im Hochformat ausgeführt wird.

Alle 3 Registerkarten funktionieren wie erwartet mit Ausnahme der Kamera-Vorschau-Oberfläche (B). Es ist um 90 Grad gedreht. Die einzige Möglichkeit, dies zu korrigieren, besteht darin, die App auf Querformat einzustellen, wodurch alle meine Registerkarten herumgeworfen werden und so gut wie nicht funktioniert wird.

Meine Lösung lautet: ersetzen

meine Kameraaktivität mit einer regulären Aktivität, die mit Ausnahme von leer ist

Intent i = new Intent(this,CameraActivity.class);
    startActivity(i);

Dadurch wird meine CameraActivity gestartet. Und das funktioniert gut. Ich musste ein lineares Layout erstellen und 3 Bilder einfügen, die wie echte Registerkarten aussehen, damit ich versuchen kann, die Funktionsweise der Registerkarten nachzuahmen, während ich den Bildschirm in Querformat drehe und die Grafiken als Hochformat behalte. Der Benutzer kann auf eines der Bilder (Schaltflächen) klicken, um die nächste Registerkarte anzuzeigen. Das ist mein Problem. Es sollte meine 'Kameraaktivität' beenden und zur 'leeren Aktivität' in einem Tab zurückkehren, wo es interpretiert werden sollte, um auf den gewünschten Tab aus meinem Bild zu klicken.

Die Hauptsache ist, wenn es zurückkehrt, kehrt es zu einer leeren (schwarzen) Seite unter einem Tab zurück (weil es 'leer' ist). Wie kann ich das Rückgabeereignis auf der Seite erfassen, auf der die Aktivität aufgerufen wurde, und dann sehen, welche Aktion sie ausgeführt haben?

Ich kann einen Onclicklistener einrichten, in dem ich auf gefälschte Registerkarten (Bilder) reagieren kann, auf die geklickt wird, um die Kameraaktivität zu beenden. Beim Beenden sollte die Registerkarte aktualisiert werden, damit Sie dorthin zurückkehren können. irgendwelche Vorschläge?

Vielen Dank,

Chrispix
quelle

Antworten:

159

Ich werde mich darauf konzentrieren zu beantworten, wie Sie Ihren Workround so auflösen können, dass er sich wie gewünscht verhält.

Um Aktionen zu erfassen, die für eine Aktivität in einer anderen ausgeführt werden, sind drei Schritte erforderlich.

Starten Sie die sekundäre Aktivität (Ihre 'Kameraaktivität') als Unteraktivität, indem Sie startActivityForResultanstelle von verwenden startActivity.

Intent i = new Intent(this,CameraActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Innerhalb der Unteraktivität (Kameraaktivität) müssen Sie nicht nur die Aktivität schließen, wenn ein Benutzer auf das andere Registerkartenbild klickt, sondern eine neue Absicht erstellen und den Index der Registerkarte einschließen, der angezeigt wird, wenn Sie mit dem Extras-Bundle zur übergeordneten App zurückkehren . Um es an den übergeordneten Anruf zurückzugeben, setResultbevor Sie anrufen finish, um die Kameraaktivität zu schließen.

resultIntent = new Intent(null);
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, tabIndexValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

Der letzte Schritt ist die aufrufende Aktivität, die überschrieben wird onActivityResult, um Rückrufe von der Kameraaktivität abzuhören. Holen Sie sich das Extra aus der zurückgegebenen Absicht, um den Index der Registerkarte zu bestimmen, die Sie anzeigen möchten.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      int tabIndex = data.getIntExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Switch tabs using the index.
      } 
      break; 
    } 
  } 
} 
Reto Meier
quelle
3
Warum schalten Sie den requestCode ein und prüfen dann, ob requestCode == RESULT_OK? Edit: Nevermind, ich sehe den Unterschied zwischen requestCode und resultCode.
Varikin
1
Kann ich dies mit einer AsynkTaskals zweite Aktivität tun ?
Francisco Corrales Morales