Bagaimana saya bisa mendapatkan konteks dalam sebuah fragmen?
Saya perlu menggunakan database saya yang konstruktornya mengambil konteks, tetapi getApplicationContext()
danFragmentClass.this
tidak bekerja jadi apa yang bisa saya lakukan?
Konstruktor basis data
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
dalam variabel instan ketika fragmen dibuat dan kemudian menggunakan konteks itu kapan pun Anda inginkan di dalam kelas fragmen. Konteks itu akan bertahan dari detasemen fragmen.getActivity
selalu tersedia. ItugetContext
yang ditambahkan di API 23.Untuk melakukan seperti jawaban di atas, Anda dapat mengganti
onAttach
metode fragmen:sumber
DatabaseHelper
dibutuhkanFragmentActivity
bukanActivity
? Misalnya, untukAdapter
...onAttach(Activity activity)
maka Anda harus merilisnya dionDetach()
onAttach
Metode telah usang,Overrides deprecated method in 'android.support.v4.app.Fragment'
Selalu gunakan metode getActivity () untuk mendapatkan konteks aktivitas terlampir Anda, tetapi selalu ingat satu hal: Fragmen sedikit tidak stabil dan
getActivity
mengembalikan null beberapa kali, jadi untuk itu, selalu periksa metode fragmen isAdded () sebelum mendapatkan konteksgetActivity()
.sumber
Cara termudah dan paling tepat untuk mendapatkan konteks fragmen yang saya temukan adalah untuk mendapatkannya langsung dari
ViewGroup
saat Anda memanggilonCreateView
metode setidaknya di sini Anda yakin tidak akan mendapatkan null untukgetActivity()
:sumber
Sebelumnya saya menggunakan
onAttach (Activity activity)
untuk mendapatkancontext
diFragment
The
onAttach (Activity activity)
Metode ini usang dalam API tingkat 23.Sekarang untuk mendapatkan konteks
Fragment
bisa kita gunakanonAttach (Context context)
context
.onCreate(Bundle)
akan dipanggil setelah ini.KODE SAMPEL
CATATAN
Kita juga bisa menggunakan
getActivity()
untuk mendapatkancontext
diFragments
tetapigetActivity()
dapat kembalinull
jika Anda yangfragment
saat ini tidak melekat pada orang tuaactivity
,sumber
sumber
Anda juga bisa mendapatkan konteks dari
inflater
parameter, saat menggantionCreateView
.sumber
Pendekatan alternatif lain adalah:
Anda bisa mendapatkan konteksnya menggunakan:
sumber
untuk mendapatkan konteks di dalam Fragmen akan dimungkinkan menggunakan
getActivity()
:Activity
keterkaitan dengan fragmen yang digunakangetActivity()
, Anda dapat menggunakannya tetapi tidak disarankan akan menyebabkan kebocoran memori.Saya pikir pendekatan yang lebih baik harus diperoleh
Activity
darionAttach()
metode:sumber
Activity.findViewById
Ini hanyalah metode praktis untuk mencari tampilan dalam tampilan konten terdaftar aktivitas tersebut (disetelsetContentView
). Dalam contoh Anda yang benar, Anda meneleponView.findViewById
, bukanActivity.findViewById
, dan Anda memanggil metode pada tampilan root yang benar . Masalah yang sama sekali berbeda, dan jelas Anda tidak akan dapat menemukan tampilan Anda dalam tampilan hiearchy yang tidak memiliki tampilan itu.getContext()
datang di API 23. Ganti dengan getActivity () di mana pun dalam kode.Lihat apakah itu memperbaiki kesalahan. Cobalah untuk menggunakan metode yang berada di antara target dan tingkat API minimun, jika tidak kesalahan ini akan terjadi.
sumber
Karena API level 23 ada
getContext()
tetapi jika Anda ingin mendukung versi yang lebih lama Anda dapat menggunakangetActivity().getApplicationContext()
sementara saya masih merekomendasikan menggunakan versi dukunganFragment
yang adaandroid.support.v4.app.Fragment
.sumber
getActivity()
adalah anak dari Konteks sehingga harus bekerja untuk Andasumber
Gunakan fragmen dari Perpustakaan Dukungan -
lalu timpa
Dengan cara ini Anda dapat yakin bahwa konteks akan selalu menjadi nilai yang bukan nol.
sumber
Anda memiliki opsi berbeda:
getActivity()
, karena ini adalah aContext
.getContext()
.Jika Anda tidak perlu mendukung versi lama maka ikuti
getContext()
.sumber
Untuk Kotlin Anda dapat menggunakan
context
langsung dalam fragmen. Tetapi dalam beberapa cased Anda akan menemukan kesalahan sepertiuntuk itu kamu bisa melakukan ini
sumber
Di kotlin hanya gunakan
activity
sajagetActivity()
sumber
Dengan API 29+ di Kotlin, saya harus melakukannya
Contohnya adalah
sumber
Idealnya, Anda tidak perlu menggunakan global. Fragmen ini memiliki notifikasi berbeda, salah satunya onActivityCreated. Anda bisa mendapatkan contoh aktivitas dalam peristiwa siklus hidup fragmen ini.
Kemudian: Anda dapat melakukan dereferensi fragmen untuk mendapatkan konteks aktivitas, konteks atau aplikasi sesuai keinginan:
this.getActivity()
akan memberi Anda pegangan untuk aktivitasthis.getContext()
akan memberi Anda pegangan untuk konteksthis.getActivity().getApplicationContext()
akan memberi Anda pegangan untuk konteks aplikasi. Anda sebaiknya menggunakan konteks aplikasi ketika meneruskannya ke db.sumber
Cara sederhana adalah menggunakan
getActivity()
. Tapi saya pikir kebingungan utama menggunakangetActivity()
metode untuk mendapatkan konteks di sini adalah pengecualian null pointer.Untuk ini, periksa terlebih dahulu dengan
isAdded()
metode yang akan menentukan apakah itu ditambahkan atau tidak, dan kemudian kita dapat menggunakangetActivity()
untuk mendapatkan konteks Kegiatan.sumber
Anda dapat menelepon
getActivity()
atau,sumber
Anda dapat menggunakan metode getActivity () untuk mendapatkan konteks atau Anda dapat menggunakan metode getContext ().
Saya harap ini membantu!
sumber
Metode getContext () membantu untuk menggunakan Konteks kelas dalam aktivitas fragmen.
sumber
Saya pikir Anda bisa menggunakannya
sumber
sumber
Anda juga dapat menggunakan:
tapi saya lebih suka menggunakan
atau
sumber
Saya perlu konteks untuk menggunakan arrayAdapter IN fragmen, ketika saya menggunakan getActivity error terjadi tetapi ketika saya menggantinya dengan getContext berfungsi untuk saya
sumber
Anda dapat menggunakan
getActivity()
ataugetContext
dalam Fragmen.Dokumentasi
dan
Kiat pro
Periksa selalu
if(getActivity!=null)
karena itu bisa nol ketika fragmen tidak dilampirkan ke aktivitas. Kadang-kadang melakukan operasi lama dalam fragmen (seperti mengambil data dari api sisanya) membutuhkan waktu. dan jika pengguna menavigasi ke fragmen lain. Maka getActivity akan menjadi nol. Dan Anda akan mendapatkan NPE jika Anda tidak menanganinya.sumber
FragmentHostCallback
kelas.Pada fragmen Anda
Aktifitas Aktif
sumber
Fragmen di dalam untuk sampel kotlin akan membantu seseorang
jika Anda menggunakan penyatuan data;
Di mana bindingView diinisialisasi di onCreateView seperti ini
sumber
Metode requireContext () adalah opsi paling sederhana
Contoh
sumber