Saya mencoba menggunakan metode getResources di kelas non-aktivitas. Bagaimana cara mendapatkan referensi ke objek "sumber daya" sehingga saya dapat mengakses file xml yang disimpan di folder sumber daya?
Contoh:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Context
objek di Android. Ini dapat menyebabkan kebocoran memori. Lihat jawaban saya untuk solusi yang tidak terlalu berisiko.Jawaban:
Anda harus memberikan
context
objek ke sana. Baikthis
jika Anda memiliki referensi ke kelas dalam suatu kegiatan, ataugetApplicationContext()
Kemudian Anda dapat menggunakannya di konstruktor (atau menyetelnya ke variabel instance):
Dimana konstruktor menerima
Context
sebagai parametersumber
Context
objek di Android. Ini dapat menyebabkan kebocoran memori.Context
objek buruk karena tidak langsung terlihat jelas apakah itu untuk seluruh aplikasi atau aktivitas. Kebocoran memori (dan crash) terjadi ketika Anda salah memasukkan. Misalnya, memasok sebuahActivity
ke objek statis yang memerlukan objekContext
dan kata tersebut tidak akan dimusnahkan jikaActivity
mengarah keActivity
persisten setelah onDestroy, karena tidak dapat digabungkan karena objek statis lainnya ini. Jadi ya, ini bisa berbahaya, tetapi mengetahui mengapa itu berbahaya saya rasa penting untuk disebutkan di sini.Bukan ide yang baik untuk menyebarkan
Context
benda-benda. Ini sering kali akan menyebabkan kebocoran memori. Saran saya adalah Anda tidak melakukannya. Saya telah membuat banyak aplikasi Android tanpa harus meneruskan konteks ke kelas non-aktivitas di aplikasi. Ide yang lebih baik adalah mendapatkan sumber daya yang Anda perlukan aksesnya saat Anda berada diActivity
atauFragment
, dan menyimpannya di kelas lain. Anda kemudian dapat menggunakan kelas tersebut di kelas lain dalam aplikasi Anda untuk mengakses sumber daya, tanpa harus menyebarkanContext
objek.sumber
Ada satu cara lagi tanpa membuat objek juga. Periksa referensi . Terima kasih untuk @cristian. Di bawah ini saya menambahkan langkah-langkah yang disebutkan dalam referensi di atas. Bagi saya, saya tidak suka membuat objek untuk itu dan akses. Jadi saya mencoba mengakses
getResources()
tanpa membuat objek. Saya menemukan posting ini. Jadi saya berpikir untuk menambahkannya sebagai jawaban.Ikuti langkah-langkah untuk mengakses
getResources()
di kelas non aktivitaswithout passing a context
melalui objek.Application
, misalnyapublic class App extends Application {
. Lihat kode di samping langkah-langkah tersebut.android:name
atribut<application>
tag AndaAndroidManifest.xml
ke untuk menunjuk ke kelas baru Anda, misalnyaandroid:name=".App"
onCreate()
metode instance aplikasi Anda, simpan konteks Anda (mis.this
) Ke bidang statis bernamaapp
dan buat metode statis yang mengembalikan bidang ini, misgetContext()
.App.getContext()
kapan pun Anda ingin mendapatkan konteks, dan kemudian kita dapat menggunakanApp.getContext().getResources()
untuk mendapatkan nilai dari sumber daya.Beginilah seharusnya terlihat:
sumber
inilah jawaban saya:
}
dan panggilannya bisa seperti ini:
sumber
ini bisa dilakukan dengan menggunakan
sumber
Context
benda bukanlah praktik yang sehatKita bisa menggunakan konteks Seperti ini coba sekarang Dimana induknya adalah ViewGroup.
sumber
tidak perlu melewati konteks dan melakukan semua itu ... cukup lakukan ini
Edit: di mana induknya adalah ViewGroup
sumber
Ini selalu berhasil untuk saya:
Tidak terkait dengan pertanyaan ini, tetapi contoh menggunakan Fragmen untuk mengakses sumber daya / aktivitas sistem seperti ini:
sumber
Dalam aplikasi pemandu wisata kursus ANdroid Dasar Udacity, saya telah menggunakan konsep Fragmen. Saya terjebak untuk sementara mengalami kesulitan untuk mengakses beberapa sumber daya string yang dijelaskan dalam string, file xml. Akhirnya mendapat solusi.
Ini adalah kelas aktivitas utama
paket com.example.android.tourguidekolkata;
Ini adalah kelas non Aktivitas yang memperluas FragmentPageAdapter
sumber
Dalam kelas sederhana deklarasikan konteks dan dapatkan data dari file dari folder res
Di kelas aktivitas, deklarasikan seperti ini
sumber
Saya terlambat tapi solusi lengkap ;: Contoh Kelas, Gunakan Konteks seperti ini: -
Peringatan (Kebocoran Memori)
Bagaimana mengatasi ini?
Opsi 1 : Daripada meneruskan konteks aktivitas yaitu ini ke kelas tunggal, Anda bisa meneruskan applicationContext ().
Opsi 2: Jika Anda benar-benar harus menggunakan konteks aktivitas, maka saat aktivitas dimusnahkan, pastikan bahwa konteks yang Anda teruskan ke kelas tunggal disetel ke null.
Semoga membantu..∆∆∆∆
sumber
di MainActivity Anda:
ResourcesHelper:
lalu gunakan di mana saja
sumber