Mam 2 działania (A i B) w mojej aplikacji na Androida i używam zamiaru przejścia z działania A do działania B. Korzystanie z aktywności parent_activity jest włączone:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Używam również motywu, który zawiera przycisk UP.
Po wywołaniu działania BI mogę użyć przycisku UP, aby wrócić do działania A. Problem polega na tym, że aplikacja wydaje się ponownie wywoływać funkcję onCreate () działania A i nie jest to zachowanie, którego potrzebuję. Potrzebuję działania A, aby wyglądało tak samo, jak wyglądało, zanim nazwałem działanie B.
Czy istnieje sposób na osiągnięcie tego?
Z góry dziękuję
EDYTOWAĆ:
Nie napisałem żadnego kodu, aby rozpocząć działanie B od działania A. Myślę, że jest ono automatycznie generowane przez zaćmienie.
Klasa B wygląda następująco:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Odpowiedzi:
Zadeklarowałeś aktywność A ze standardem
launchMode
w manifeście Androida. Zgodnie z dokumentacją oznacza to, co następuje:Dlatego system jest zmuszony do odtworzenia działania A (tj. Wywołania
onCreate
), nawet jeśli stos zadań jest obsługiwany poprawnie.Aby rozwiązać ten problem, musisz zmienić manifest, dodając następujący atrybut do deklaracji działania A:
Uwaga: wywoływanie
finish()
(jak sugerowano wcześniej jako rozwiązanie) działa tylko wtedy, gdy masz całkowitą pewność, że wystąpienie działania B, które kończysz, działa nad wystąpieniem działania A. W bardziej złożonych przepływach pracy (na przykład uruchamianie działania B z powiadomienia) może tak nie być i musisz poprawnie uruchomić działanie A z B.źródło
navigateUpFromSameTask(...)
należy dodawaćFLAG_ACTIVITY_CLEAR_TOP
doupIntent
(przeznavigateUpTo(...)
co powinno to skutkować takim samym zachowaniem (zgodnie z tym przewodnikiem ), ale flaga nigdy nie jest ustawiona - i dlatego ta odpowiedź ma sensZaktualizowana odpowiedź: Up Design nawigacji
Musisz zadeklarować, które działanie jest odpowiednim rodzicem dla każdego działania. Dzięki temu system może ułatwić wzorce nawigacji, takie jak Up, ponieważ system może określić logiczną aktywność nadrzędną na podstawie pliku manifestu.
W tym celu musisz zadeklarować swoją aktywność nadrzędną w tagu Aktywność z atrybutem
android:parentActivityName
Lubić,
Po zadeklarowaniu w ten sposób działania nadrzędnego możesz nawigować w górę do odpowiedniego rodzica, jak poniżej,
Wywołanie
NavUtils.navigateUpFromSameTask(this);
tej metody powoduje zakończenie bieżącej czynności i rozpoczęcie (lub wznowienie) odpowiedniej czynności nadrzędnej. Jeśli docelowa aktywność nadrzędna znajduje się na tylnym stosie zadania, jest przekazywana do przodu zgodnie z definicjąFLAG_ACTIVITY_CLEAR_TOP
.Aby wyświetlić przycisk Up, musisz zadeklarować
setDisplayHomeAsUpEnabled():
Stara odpowiedź: (Bez nawigacji w górę, domyślna nawigacja wstecz)
Dzieje się tak tylko wtedy, gdy ponownie zaczynasz działanie A od działania B.
Korzystanie
startActivity()
.Zamiast tego z działania A rozpocznij działanie B, używając
startActivityForResult()
i zastępująconActivtyResult()
działanie A.Teraz w ćwiczeniu B po prostu wywołaj
finish()
przycisk W górę. Więc teraz skierowałeś się do działania AonActivityResult()
bez ponownego tworzenia działania A.źródło
NavUtils.navigateUpFromSameTask(this);
pisać wiersz kodufinish()
.finish()
anistartActivityForResult()
w swojej dokumentacji dotyczącej nawigacji ( developer.android.com/design/patterns/navigation.html )?Miałem prawie taką samą konfigurację, co prowadzi do tego samego niepożądanego zachowania. Dla mnie to zadziałało: dodanie następującego atrybutu do działania A w
Manifest.xml
mojej aplikacji:Więcej informacji znajdziesz w tym artykule .
źródło
Chociaż stare pytanie, oto inne (imho najczystsze i najlepsze) rozwiązanie, ponieważ wszystkie poprzednie odpowiedzi nie działały dla mnie, ponieważ głęboko powiązałem działanie B z widżetu .
[ https://stackoverflow.com/a/31350642/570168 ]
Ale zobacz także: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
źródło
Lepszym sposobem na osiągnięcie tego jest użycie dwóch rzeczy: połączenie:
Teraz, aby to zadziałało, musisz mieć plik manifestu informujący, że działanie A ma działanie nadrzędne B. Działanie nadrzędne nie potrzebuje niczego. W wersji 4 i wyższej dostaniesz ładną strzałkę wstecz bez dodatkowego wysiłku (można to zrobić również w niższych wersjach za pomocą małego kodu, umieszczę ją poniżej). Możesz ustawić te dane na karcie manifest-> w GUI (przewiń w dół do nazwy działania rodzica i umieść go ręcznie)
Węzeł wsparcia:
jeśli chcesz obsługiwać wersję poniżej wersji 4, musisz również dołączyć metadane. kliknij aktywność prawym przyciskiem myszy, dodaj-> metadane, name = android.support.PARENT_ACTIVITY i value = your.full.activity.name
aby uzyskać ładną strzałkę również w niższych wersjach:
Uwaga: aby wszystko działało, potrzebujesz biblioteki pomocy technicznej w wersji 7, ale warto!
źródło
Dla mnie zadziałało dodanie:
do
TheRelevantActivity.java
i teraz działa zgodnie z oczekiwaniamii tak nie zapomnij dodać:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
wonCreate()
metodzieźródło
Próbowałem
android:launchMode="singleTask"
, ale to nie pomogło. Pracował dla mnie przy użyciuandroid:launchMode="singleInstance"
źródło
Dodając do odpowiedzi @ LorenCK, zmień
na poniższy kod, jeśli twoja aktywność może być zainicjowana z innej aktywności, która może stać się częścią zadania rozpoczętego przez inną aplikację
Spowoduje to rozpoczęcie nowego zadania i rozpoczęcie działania nadrzędnego działania, które można zdefiniować w Manifeście, jak poniżej wersji Min SDK <= 15
Lub używając,
parentActivityName
jeśli jego> 15źródło
parentActivityName
SDK> 15, boMiałem podobny problem podczas używania Androida 5.0 ze złą nazwą aktywności rodzica
Usunąłem com.example.myfirstapp z nazwy działania rodzica i działało to poprawnie
źródło
Dodaj do manifestu informacje o aktywności za pomocą atrybutu
działa dobrze dla mnie
źródło
W klasie Java: -
W Manifeście: -
To ci pomoże
źródło
jak prasa wsteczna
źródło
Spróbuj tego:
źródło
Przejście do mojego manifestu i dodanie
android:launchMode="singleTop"
do aktywności pomogło mi.To konkretnie rozwiązało mój problem, ponieważ nie chciałem, aby Android utworzył nową instancję poprzedniej aktywności po naciśnięciu
Up
przycisku na pasku narzędzi - zamiast tego chciałem użyć istniejącej instancji poprzedniej aktywności, gdy wszedłem do hierarchii nawigacji.Odniesienie: android: launchMode
źródło
Wypróbuj to rozwiązanie, użyj NavUtils.navigateUpFromSameTask (this); w aktywności podrzędnej: https://stackoverflow.com/a/49980835/7308789
źródło