Saya telah menemukan R.string
cukup bagus untuk menjaga string hardcoded dari kode saya, dan saya ingin tetap menggunakannya dalam kelas utilitas yang berfungsi dengan model-model dalam aplikasi saya untuk menghasilkan output. Misalnya, dalam hal ini saya membuat email dari model di luar kegiatan.
Apakah mungkin menggunakan di getString
luar Context
atauActivity
? Saya kira saya bisa lulus dalam aktivitas saat ini, tetapi tampaknya tidak perlu. Harap perbaiki saya jika saya salah!
Sunting: Bisakah kita mengakses sumber daya tanpa menggunakan Context
?
java
android
string
android-resources
android-context
SapphireSun
sumber
sumber
Jawaban:
Ya, kami dapat mengakses sumber daya tanpa menggunakan `Konteks`
Kamu bisa memakai:
... di mana-mana di aplikasi Anda, bahkan dalam deklarasi konstanta statis. Sayangnya, ini hanya mendukung sumber daya sistem .
Untuk sumber daya lokal gunakan solusi ini . Itu tidak sepele, tetapi berhasil.
sumber
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Sayangnya, satu-satunya cara Anda dapat mengakses sumber daya string apa pun adalah dengan
Context
(yaitu,Activity
atauService
). Apa yang biasanya saya lakukan dalam kasus ini, adalah hanya meminta penelepon untuk lulus dalam konteks.sumber
ctx.getString(ctx.R.string.blah);
Context
sehingga Anda dapat menggunakannya dari Aktivitas atau Layanan.ctx.R.string.blah
, cukup gunakanR.string.blah
symbol not found error
datangnya, tetapi pastikan Anda telahR
mengimpor di atas kelas.Di
MyApplication
, yang meluasApplication
:Dalam
MyApplication
'sonCreate
:Sekarang Anda dapat menggunakan bidang ini dari mana saja di aplikasi Anda.
sumber
BTW, salah satu alasan simbol tidak ditemukan kesalahan mungkin karena IDE Anda mengimpor android.R; kelas bukan milikmu satu. Cukup ganti impor android.R; untuk mengimpor your.namespace.R;
Jadi 2 hal dasar untuk membuat string terlihat di kelas yang berbeda:
sumber
Pendekatan Unik
App.getRes().getString(R.string.some_id)
(1) Buat atau Edit (jika sudah ada)
Application
kelas Anda .(2) Tambahkan bidang nama ke
manifest.xml
<application
tag Anda .Sekarang kamu baik untuk pergi. Gunakan
App.getRes().getString(R.string.some_id)
di mana saja di aplikasi.sumber
Jika Anda memiliki kelas yang Anda gunakan dalam suatu kegiatan dan Anda ingin memiliki akses sumber daya di kelas itu, saya sarankan Anda untuk mendefinisikan konteks sebagai variabel pribadi di kelas dan memulainya dalam konstruktor:
Membuat instan kelas dalam aktivitas Anda:
sumber
Ini akan membuat Anda mendapatkan akses
applicationContext
dari mana saja memungkinkan Anda untuk mendapatkan diapplicationContext
mana saja yang dapat menggunakannya;Toast
,getString()
,sharedPreferences
, DllSingleton:
Inisialisasi Singleton di
Application
subkelas Anda :Jika saya tidak salah, ini memberi Anda pengait ke applicationContext di mana saja, sebut saja dengan itu.
ApplicationContextSingleton.getInstance.getApplicationContext();
Anda tidak perlu menghapus ini di titik mana pun, seperti saat aplikasi ditutup, ini tetap berlaku.Ingatlah untuk memperbarui
AndroidManifest.xml
untuk menggunakanApplication
subkelas ini :Tolong beri tahu saya jika Anda melihat sesuatu yang salah di sini, terima kasih. :)
sumber
Pendekatan terbaik dari respons Khemraj:
Kelas aplikasi
Deklarasi dalam manifes
Kelas konstanta
Menggunakan
sumber
Lebih baik menggunakan sesuatu seperti ini tanpa konteks dan aktivitas :
sumber
Entah bagaimana tidak suka solusi hacking dari menyimpan nilai statis jadi datang dengan sedikit lebih lama tetapi versi bersih yang dapat diuji juga.
Ditemukan 2 cara yang mungkin untuk melakukannya-
misalnya
Sebelum Anda membaca: Versi ini digunakan
Data binding
XML-
Kegiatan / Fragmen-
Terkadang, Anda perlu mengubah teks berdasarkan bidang dalam model. Jadi Anda akan mengikat data model itu juga dan karena aktivitas / fragmen Anda tahu tentang model tersebut, Anda dapat mengambil nilai dengan sangat baik dan kemudian mengikat data string berdasarkan itu.
sumber
Anda dapat melakukan ini di Kotlin dengan membuat kelas yang memperluas Aplikasi dan kemudian menggunakan konteksnya untuk memanggil sumber daya di mana saja dalam kode Anda
Kelas Aplikasi Anda akan terlihat seperti ini
Deklarasikan kelas Aplikasi Anda di AndroidManifest.xml (sangat penting)
Untuk mengakses mis. File string, gunakan kode berikut
sumber
Inilah yang saya lakukan, Di MainActivity Anda, buat variabel statis untuk konteks seperti yang ditunjukkan di bawah ini:
dan di onCreate () inisialisasi mContext untuk ini;
Kemudian, dalam file tempat Anda ingin mengakses konteks, katakan,
Sekarang, Anda bisa mendapatkan sumber daya string dengan cara berikut,
sumber
Saya menggunakan
getContext().getApplicationContext().getString(R.string.nameOfString);
ini bekerja untuk saya.sumber
getContext()
tersedia di mana-mana ?!