Saya ingin merujuk string dari string lain dalam file strings.xml saya, seperti di bawah ini (khusus perhatikan akhir dari isi string "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
Saya sudah mencoba sintaks di atas tetapi kemudian teks mencetak "@ string / button_text" sebagai teks yang jelas. Bukan yang saya inginkan. Saya ingin teks pesan dicetak "Anda belum memiliki item! Tambahkan satu dengan menekan tombol 'Tambahkan item'."
Adakah cara yang diketahui untuk mencapai apa yang saya inginkan?
RATIONALE:
Aplikasi saya memiliki daftar item, tetapi ketika daftar itu kosong saya menunjukkan TextView "@android: id / empty". Teks dalam TextView itu untuk memberi tahu pengguna cara menambahkan item baru. Saya ingin membuat tata letak saya menjadi bukti perubahan (ya, saya yang bodoh dalam pertanyaan :-)
Jawaban:
Cara yang bagus untuk menyisipkan string yang sering digunakan (misalnya nama aplikasi) dalam xml tanpa menggunakan kode Java: source
MEMPERBARUI:
Anda bahkan dapat mendefinisikan entitas Anda secara global misalnya:
res / raw / entitas.ent:
res / values / string.xml:
sumber
Dimungkinkan untuk merujuk satu di dalam yang lain selama seluruh string Anda terdiri dari nama referensi. Misalnya ini akan berfungsi:
Ini bahkan lebih berguna untuk menetapkan nilai default:
Sekarang Anda dapat menggunakan
string_default
di mana saja dalam kode Anda dan Anda dapat dengan mudah mengubah default kapan saja.sumber
Saya pikir kamu tidak bisa. Tetapi Anda dapat "memformat" string sesuka Anda:
Dalam kode:
sumber
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
sedikit lebih bersih.Di Android Anda tidak dapat menggabungkan Strings di dalam xml
Mengikuti tidak didukung
Periksa tautan ini di bawah untuk mengetahui cara mencapainya
Bagaimana cara menggabungkan beberapa string dalam XML android?
sumber
Saya membuat plugin gradle sederhana yang memungkinkan Anda untuk merujuk satu string dari yang lain. Anda bisa merujuk string yang didefinisikan dalam file lain, misalnya dalam varian build atau pustaka yang berbeda. Kontra dari pendekatan ini - refactor IDE tidak akan menemukan referensi seperti itu.
Gunakan
{{string_name}}
sintaks untuk merujuk string:Untuk mengintegrasikan plugin, cukup tambahkan kode berikutnya ke
build.gradle
file level modul aplikasi atau pustaka AndaUPDATE: Perpustakaan tidak bekerja dengan Android gradle plugin versi 3.0 dan di atas karena versi baru dari plugin menggunakan aapt2 yang mengemas sumber daya ke dalam format biner .flat, sehingga sumber daya yang dikemas tidak tersedia untuk perpustakaan. Sebagai solusi sementara Anda dapat menonaktifkan aapt2 dengan mengatur android.enableAapt2 = false di file gradle.properties Anda.
sumber
> Could not get unknown property 'referencedString'
Anda bisa menggunakan logika Anda sendiri, yang menyelesaikan string bersarang secara rekursif.
Dari
Activity
, misalnya, sebut saja seperti itusumber
Saya sadar bahwa ini adalah posting yang lebih lama, tetapi saya ingin berbagi solusi cepat dan kotor yang saya buat untuk proyek saya. Ini hanya berfungsi untuk TextViews tetapi dapat disesuaikan dengan widget lainnya juga. Perhatikan bahwa ini membutuhkan tautan yang akan diapit tanda kurung siku (mis
[@string/foo]
.).Kelemahan dari pendekatan ini adalah yang
setText()
mengubahCharSequence
keString
, yang merupakan masalah jika Anda melewatkan hal-hal sepertiSpannableString
; untuk proyek saya ini bukan masalah karena saya hanya menggunakannya untukTextViews
itu saya tidak perlu mengakses dari sayaActivity
.sumber
Dengan pengikatan data baru, Anda dapat menggabungkan dan melakukan lebih banyak lagi di xml Anda.
misalnya jika Anda mendapat message1 dan message2 Anda dapat:
Anda bahkan dapat mengimpor beberapa utilitas teks dan memanggil String.format dan teman-teman.
sayangnya jika Anda ingin menggunakannya kembali di beberapa tempat itu bisa berantakan, Anda tidak ingin potongan kode ini ada di mana-mana. dan Anda tidak dapat mendefinisikannya dalam xml di satu tempat (bukan yang saya ketahui) sehingga untuk itu Anda dapat membuat kelas yang akan merangkum komposisi tersebut:
maka Anda dapat menggunakannya sebagai gantinya (Anda harus mengimpor kelas dengan ikatan data)
sumber
Selain jawaban di atas oleh Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Tampaknya ada kesalahan kompilasi "& entitas; direferensikan, tetapi tidak dideklarasikan" yang dapat diselesaikan dengan merujuk pada deklarasi eksternal seperti ini
res / raw / entitas.ent
res / values / strings.xml
Meskipun mengkompilasi dan menjalankannya memiliki nilai kosong. Mungkin seseorang tahu bagaimana menyelesaikan ini. Saya akan mengirim komentar tetapi reputasi minimum adalah 50.
sumber
Anda bisa menggunakan string placeholder (% s) dan menggantinya menggunakan java saat run-time
dan di java
dan kemudian mengaturnya ke tempat di mana ia menggunakan string
sumber
%1$s
,%2$s
dll bukan%s
.Saya telah membuat perpustakaan kecil yang memungkinkan Anda untuk menyelesaikan placeholder ini saat buildtime, jadi Anda tidak perlu menambahkan kode Java / Kotlin untuk mencapai apa yang Anda inginkan.
Berdasarkan contoh Anda, Anda harus mengatur string Anda seperti ini:
Dan kemudian plugin akan mengurus menghasilkan hal-hal berikut:
Ini berfungsi juga untuk string terlokalisasi dan rasa, juga string yang dihasilkan akan menjaga diri mereka diperbarui setiap kali Anda membuat perubahan pada template Anda atau nilainya.
Info lebih lanjut di sini: https://github.com/LikeTheSalad/android-string-reference
sumber