Saya telah menerapkan ListView
dalam aplikasi Android saya. Saya mengikat ini ListView
menggunakan subkelas kustom ArrayAdapter
kelas. Di dalam ArrayAdapter.getView(...)
metode yang diganti , saya menetapkan sebuah OnClickListener
. Dalam onClick
metode OnClickListener
, saya ingin meluncurkan aktivitas baru. Saya mendapatkan pengecualian:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Bagaimana saya bisa mendapatkan Context
bahwa ListView
(saat ini Activity
) bekerja di bawah?
Jawaban:
Antara
Atau sebagai pilihan terakhir,
_
Sunting - saya akan menghindari pengaturan bendera karena akan mengganggu aliran normal tumpukan peristiwa dan riwayat.
sumber
context.startActivity(intent);
saya hanya berubahcontext
dariApplicationContext
keActivity
jenis. Ini memperbaiki masalah.Anda dapat mencapainya dengan addFlags alih-alih
setFlags
Menurut dokumentasi yang dilakukannya:
EDIT
Berhati-hatilah jika Anda menggunakan bendera yang Anda ubah tumpukan riwayat seperti yang dikatakan Alex Volovoy :
sumber
Alih-alih menggunakan
(getApplicationContext)
gunakanYourActivity.this
sumber
activity.startActivity
bukannyacontext.startActivity
Jika Anda mendapat kesalahan karena menggunakan create chooser seperti di bawah ini:
Atur bendera untuk membuat pemilih seperti ini:
sumber
Selain itu: jika Anda menampilkan tautan dalam tampilan daftar dalam fragmen , jangan buat seperti ini
alih-alih menelepon
Adaptor berfungsi dengan baik dalam kedua kasus, tetapi tautan hanya berfungsi di yang terakhir.
sumber
getApplicationContext()
(kecuali inisialisasi aplikasi), tetapi menangkap pengecualian ini. Jadi, situasinya bisa berbeda.this
sebagai konteks berfungsi karena terkait dengan aktivitas saat ini.Saya pikir mungkin Anda menerapkan OnClickListener di tempat yang salah - biasanya Anda harus menerapkan OnItemClickListener di Aktivitas Anda dan meletakkannya di ListView sebagai gantinya, atau Anda akan mendapatkan masalah dengan acara Anda ...
sumber
atau
ubah ke bawah
sumber
Di
Android 28(Android P)
startActivityJadi cara terbaik adalah menambahkan
FLAG_ACTIVITY_NEW_TASK
sumber
Lihat, jika Anda membuat maksud dalam listiner dalam beberapa metode
kemudian panggil konteks melalui tampilan ini juga:
Bahkan tidak akan membutuhkan SetFlags ...
sumber
Bagi siapa pun yang menggunakan Xamarin.Android (MonoDroid) bahkan ketika StartActivity dipanggil dari aktivitas - ini sebenarnya adalah bug Xamarin dengan runtime ART baru, lihat https://bugzilla.xamarin.com/show_bug.cgi?id=17630
sumber
Menguraikan jawaban Alex Volovoy sedikit lagi -
jika Anda mendapatkan masalah ini dengan fragmen, getActivity () berfungsi dengan baik untuk mendapatkan konteksnya
Dalam kasus lain:
Jika Anda tidak ingin menggunakan-
lalu buat fungsi seperti ini di OutsideClass Anda -
Sekarang, dalam aktivitas utama Anda kapan pun Anda membuat OutsideClass baru panggil metode di atas segera setelah Anda menentukan OutsideClass yang memberikan konteks aktivitas sebagai argumen. Juga dalam aktivitas utama Anda membuat fungsi-
sekarang kembali ke OutsideClass Anda, dan untuk memulai aktivitas baru lakukan sesuatu seperti ini-
Dengan cara ini Anda akan dapat memulai berbagai aktivitas yang dipanggil dari OutsideClass yang berbeda tanpa mengacaukan bendera.
Catatan-Usahakan untuk tidak men-cache objek konteks melalui konstruktor untuk fragmen (dengan adaptor, baik-baik saja). Sebuah fragmen harus memiliki konstruktor kosong jika tidak aplikasi crash dalam beberapa skenario.
ingatlah untuk menelepon
dalam fungsi onResume () juga.
sumber
Kesalahan ini terjadi ketika mulai aktif tidak tahu mana aktivitasnya. Jadi, Anda harus menambahkan aktivitas sebelum startActivity ()
Anda harus mengatur
sumber
startActivity
dariFragment
, penelepon sering kali dapat berupa fragmen, bukan aktivitas.Menurut pendapat saya, lebih baik menggunakan metode
startActivity()
hanya dalam kode AndaActivity.class
. Jika Anda menggunakannya di kelasAdapter
atau lainnya, itu akan menghasilkan itu.sumber
Saya juga punya masalah yang sama. Periksa semua konteks yang telah Anda lewati. Untuk ' tautan ' perlu Konteks Aktivitas, bukan konteks Aplikasi .
Ini adalah tempat di mana Anda harus memeriksa:
1.) Jika Anda menggunakan LayoutInflater maka periksa konteks apa yang telah Anda lewati.
2.) Jika Anda menggunakan Adaptor apa pun periksa konteks apa yang telah Anda lewati.
sumber
Saya memiliki masalah yang sama. Masalahnya dengan konteks. Jika Anda ingin membuka tautan apa pun (misalnya berbagi tautan apa saja melalui pemilih), lewati konteks aktivitas, bukan konteks aplikasi.
Jangan lupa menambahkan
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
jika Anda tidak ada dalam aktivitas Anda.sumber
Gunakan kode ini di Adapter_Activity Anda dan gunakan
context.startActivity(intent_Object)
danintent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Seperti ini:
Berhasil....
sumber
Saya harap ini akan berhasil.
sumber
Menghadapi masalah yang sama kemudian diimplementasikan
dan dipecahkan masalahnya.
Mungkin ada alasan lain yang terkait dengan adaptor tampilan daftar.
Anda dapat melihat blog ini , menggambarkannya dengan sangat baik.
sumber
Gunakan kode ini. Bekerja dengan baik untuk saya. Bagikan Sesuatu dari Luar Aktivitas:
sumber
Karena menambahkan flag mempengaruhi
event_flow
danstack_history
lebih baik meneruskan 'konteks aplikasi' ke non-aktivitas dari mana Anda perlu memanggil kelas aktivitas dengan cara berikut:"ActivityClassName.this" (Saat Anda melewati konteks dengan cara ini, itu akan berisi semua detail dan info yang Anda butuhkan untuk memanggil Aktivitas dari skenario non-aktivitas)
Jadi tidak perlu mengatur atau menambahkan flag, ini akan berfungsi dengan baik dalam setiap kasus.
sumber
sumber
Jika Anda meminta bagian Intent dalam plugin Cordova, pengaturan Bendera tidak akan membantu. Alih-alih gunakan ini -
sumber
Situasi saya sedikit berbeda, saya sedang menguji aplikasi saya menggunakan
Espresso
dan saya harus meluncurkan Kegiatan saya denganActivityTestRule
dari instrumentasiContext
(yang bukan yang berasal dari suatuActivity
).Saya harus mengubah flag dan menambahkan
or
bitwise (|
di Java) denganIntent.FLAG_ACTIVITY_NEW_TASK
Jadi itu menghasilkan:
sumber
Versi Kotlin
sumber