Saya memiliki 2 aktivitas (A dan B) di aplikasi android saya dan saya menggunakan maksud untuk beralih dari aktivitas A ke aktivitas B. Penggunaan parent_activity diaktifkan:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Saya juga menggunakan tema yang menyediakan tombol-UP.
Jadi setelah saya menelepon aktivitas BI dapat menggunakan tombol-UP untuk kembali ke aktivitas A. Masalahnya adalah aplikasi tersebut sepertinya memanggil onCreate () -fungsi dari aktivitas A lagi dan ini bukan perilaku yang saya butuhkan. Saya membutuhkan aktivitas A agar terlihat sama seperti sebelum saya menelepon aktivitas B.
Apakah ada cara untuk mencapai ini?
Terima kasih sebelumnya
EDIT:
Saya tidak menulis kode apa pun untuk memulai aktivitas B dari aktivitas A. Saya pikir ini dibuat otomatis oleh gerhana.
Kelas B terlihat seperti:
@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);
}
Jawaban:
Anda mendeklarasikan aktivitas A dengan standar
launchMode
di manifes Android. Menurut dokumentasi , itu berarti yang berikut:Oleh karena itu, sistem dipaksa untuk membuat kembali aktivitas A (yaitu panggilan
onCreate
) bahkan jika tumpukan tugas ditangani dengan benar.Untuk memperbaiki masalah ini, Anda perlu mengubah manifes, menambahkan atribut berikut ke deklarasi aktivitas A:
Catatan: menelepon
finish()
(seperti yang disarankan sebagai solusi sebelumnya) hanya berfungsi bila Anda benar - benar yakin bahwa aktivitas B misalnya Anda mengakhiri hidup di atas instance aktivitas A. Dalam alur kerja yang lebih kompleks (misalnya, meluncurkan aktivitas B dari pemberitahuan) ini mungkin tidak terjadi dan Anda harus benar memulai aktivitas A dari B.sumber
navigateUpFromSameTask(...)
harus ditambahkanFLAG_ACTIVITY_CLEAR_TOP
keupIntent
(melaluinavigateUpTo(...)
yang harus menghasilkan perilaku yang sama (sesuai dengan panduan ini ), tetapi bendera tidak pernah ditetapkan - dan karena itu jawaban ini masuk akalJawaban Diperbarui: Desain Navigasi Atas
Anda harus mendeklarasikan aktivitas mana yang merupakan induk yang tepat untuk setiap aktivitas. Melakukannya memungkinkan sistem untuk memfasilitasi pola navigasi seperti Naik karena sistem dapat menentukan aktivitas induk logis dari file manifes.
Jadi untuk itu Anda harus mendeklarasikan Aktivitas induk Anda di tag Activity dengan atribut
android:parentActivityName
Suka,
Dengan aktivitas induk yang dideklarasikan dengan cara ini, Anda dapat menavigasi ke induk yang sesuai seperti di bawah ini,
Jadi, ketika Anda memanggil
NavUtils.navigateUpFromSameTask(this);
metode ini, ia menyelesaikan aktivitas saat ini dan memulai (atau melanjutkan) aktivitas induk yang sesuai. Jika aktivitas induk target ada di tumpukan belakang tugas, itu diajukan seperti yang didefinisikan olehFLAG_ACTIVITY_CLEAR_TOP
.Dan untuk menampilkan tombol Atas Anda harus mendeklarasikan
setDisplayHomeAsUpEnabled():
Jawaban Lama: (Tanpa Navigasi Naik, Navigasi Kembali bawaan)
Itu terjadi hanya jika Anda memulai kembali Kegiatan A dari Kegiatan B.
Menggunakan
startActivity()
.Alih-alih dari Aktivitas A, mulai Kegiatan B menggunakan
startActivityForResult()
dan menimpaonActivtyResult()
di Aktivitas A.Sekarang di Aktivitas B cukup panggil
finish()
tombol Naik. Jadi sekarang Anda diarahkan ke Activity AonActivityResult()
tanpa membuat Activity A lagi ..sumber
NavUtils.navigateUpFromSameTask(this);
menulis baris kodefinish()
.finish()
ataustartActivityForResult()
dalam dokumentasi mereka tentang Navigasi ( developer.android.com/design/patterns/navigation.html )?Saya memiliki pengaturan yang hampir sama yang mengarah ke perilaku yang tidak diinginkan yang sama. Bagi saya ini berhasil: menambahkan atribut berikut ke aktivitas A di
Manifest.xml
aplikasi saya:Lihat artikel ini untuk penjelasan lebih lanjut.
sumber
Meskipun merupakan pertanyaan lama, inilah solusi (imho yang terbersih dan terbaik) yang lain karena semua jawaban sebelumnya tidak berhasil bagi saya karena saya mendalami Aktivitas B dari Widget .
[ https://stackoverflow.com/a/31350642/570168 ]
Tetapi juga lihat: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
sumber
Cara yang lebih baik untuk mencapai ini adalah dengan menggunakan dua hal: panggilan:
Sekarang, agar ini berfungsi, Anda harus memiliki file manifes Anda menyatakan bahwa aktivitas A memiliki aktivitas induk B. Aktivitas induk tidak memerlukan apa-apa. Di versi 4 dan di atas Anda akan mendapatkan panah kembali yang bagus tanpa upaya tambahan (ini dapat dilakukan pada versi yang lebih rendah juga dengan sedikit kode, saya akan meletakkannya di bawah) Anda dapat mengatur data ini di tab aplikasi manifest-> di GUI (gulir ke bawah ke nama aktivitas induk, dan letakkan dengan tangan)
Node pendukung:
jika Anda ingin mendukung versi di bawah versi 4, Anda harus memasukkan metadata juga. klik kanan pada aktivitas, tambahkan-> meta data, nama = android.support.PARENT_ACTIVITY dan nilai = your.full.activity.name
untuk mendapatkan panah yang bagus di versi yang lebih rendah juga:
harap dicatat Anda akan membutuhkan dukungan perpustakaan versi 7 untuk membuat semua ini berfungsi, tetapi itu sangat berharga!
sumber
Apa yang berhasil bagi saya adalah menambahkan:
ke
TheRelevantActivity.java
dan sekarang berfungsi seperti yang diharapkandan ya jangan lupa menambahkan:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
dalamonCreate()
metodesumber
Saya mencoba
android:launchMode="singleTask"
, tetapi itu tidak membantu. Bekerja untuk saya gunakanandroid:launchMode="singleInstance"
sumber
Menambah jawaban @ LorenCK, ubah
ke kode di bawah ini jika aktivitas Anda dapat dimulai dari aktivitas lain dan ini dapat menjadi bagian dari tugas yang dimulai oleh beberapa aplikasi lain
Ini akan memulai tugas baru dan memulai Aktivitas induk Aktivitas Anda yang dapat Anda tetapkan dalam Manifest seperti di bawah ini dari versi Min SDK <= 15
Atau menggunakan
parentActivityName
jika> 15sumber
parentActivityName
untuk SDK> 15 atau yang lain itu akan memberi Anda beberapa crash acakSaya memiliki masalah serupa menggunakan Android 5.0 dengan nama aktivitas orang tua yang buruk
Saya menghapus com.example.myfirstapp dari nama aktivitas induk dan itu berfungsi dengan baik
sumber
Tambahkan ke informasi manifes aktivitas Anda dengan atribut
bekerja dengan baik untuk saya
sumber
Di kelas Java: -
Dalam Manifes: -
Itu akan membantumu
sumber
seperti tekan Kembali
sumber
coba ini:
sumber
Pergi ke manifes saya dan menambahkan
android:launchMode="singleTop"
aktivitas tersebut membantu saya.Ini secara khusus menyelesaikan masalah saya karena saya tidak ingin Android membuat contoh baru dari aktivitas sebelumnya setelah memukul
Up
tombol di toolbar - Saya malah ingin menggunakan instance yang ada dari aktivitas sebelumnya ketika saya naik hierarki navigasi.Referensi: android: launchMode
sumber
Coba solusi ini gunakan NavUtils.navigateUpFromSameTask (ini); dalam aktivitas anak: https://stackoverflow.com/a/49980835/7308789
sumber