Android: przechwytywanie powrotu aktywności

82

Mam pytanie dotyczące rozpoczęcia nowej działalności. Sprowadza się do tego. Mam 3 zakładki w widoku

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

Wymagane jest, aby aplikacja działała w trybie portretowym.

Wszystkie 3 karty działają zgodnie z oczekiwaniami z wyjątkiem powierzchni podglądu aparatu (B). Jest obrócony o 90 stopni. Jedynym sposobem na poprawienie tego jest ustawienie aplikacji na krajobraz, który rzuca wszystkie moje karty i jest prawie niewykonalny.

Moje rozwiązanie jest takie: wymień

moja aktywność aparatu z regularną aktywnością, która jest pusta z wyjątkiem

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

Spowoduje to uruchomienie mojej CameraActivity. I to działa dobrze. Musiałem zrobić układ liniowy i dołączyć 3 obrazy, które wyglądają jak prawdziwe karty, więc mogę spróbować naśladować działanie kart, jednocześnie obracając ekran w poziomie i zachowując wizualizacje jako pionowe. Użytkownik może kliknąć jeden z obrazów (przycisków), aby wyświetlić następną zakładkę. To jest mój problem. Powinien wyjść z mojej „aktywności kamery” i powrócić do „pustej aktywności” na karcie, gdzie należy zinterpretować kliknięcie wybranej karty z mojego obrazu.

Najważniejsze jest to, że po powrocie powraca do pustej (czarnej) strony pod zakładką (ponieważ jest „pusta”). Jak mogę przechwycić zdarzenie powrotu z powrotem na stronę, która wywołała działanie, a następnie zobaczyć, jakie działanie wykonali?

Mogę ustawić onclicklistener, w którym mogę reagować na fałszywe karty (obrazy), które są klikane, aby wyjść z aktywności kamery. Po zakończeniu zakładka powinna się zaktualizować, aby to było miejsce, w którym wracasz. jakieś sugestie?

Dzięki,

Chrispix
źródło

Odpowiedzi:

159

Skoncentruję się na odpowiedziach, jak rozwiązać problem, aby działał tak, jak chcesz.

Przechwytywanie czynności wykonywanych na jednym działaniu w innym wymaga trzech kroków.

Uruchom działanie drugorzędne („działanie aparatu”) jako działanie podrzędne, używając startActivityForResultzamiast startActivity.

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

W ramach podaktywności (aktywność kamery), zamiast po prostu zamykać działanie, gdy użytkownik kliknie inny obraz karty, musisz utworzyć nową intencję i dołączyć indeks karty, która będzie wyświetlana po powrocie do aplikacji nadrzędnej za pomocą pakietu dodatków . Przekazanie go z powrotem do połączenia rodzica setResultprzed wywołaniem w finishcelu zamknięcia działania kamery.

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

Ostatnim krokiem jest wywołanie działania, nadpisanie, onActivityResultaby nasłuchiwać wywołań zwrotnych z działania kamery. Pobierz dodatkowe z zwróconej intencji, aby określić indeks karty, którą powinieneś wyświetlić.

@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
źródło
3
Dlaczego włączasz requestCode, a następnie sprawdzasz, czy requestCode == RESULT_OK? Edycja: nieważne, widzę różnicę requestCode / resultCode.
varikin
1
czy mogę to zrobić AsynkTaskjako drugie działanie ?
Francisco Corrales Morales