Android XML Perscent Symbol

309

Saya memiliki array string di mana %simbol digunakan. Format yang tepat untuk menggunakan %is %. Ketika saya memiliki string dalam array dengan banyak %itu memberi saya kesalahan ini.

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected
Zaid
sumber
6
Bisakah Anda memposting XML yang menyebabkan kesalahan ini? Bisa sangat sulit untuk mengidentifikasi masalah tanpa melihat penyebabnya.
Chris Cashwell
ini adalah kesalahan yang dapat dengan mudah direplikasi oleh string apa pun dengan 2% simbol atau lebih.
zaid
Jika tidak mencari tujuan pemformatan, cara yang lebih baik untuk mencapai.
Shishir Gupta
Dalam kasus saya, saya salah memasukkan param format 1% $ s, bukan% 1 $ s.
Ashokchakravarthi Nagarajan

Jawaban:

467

Perangkat Pengemasan Aset Android ( aapt) telah menjadi sangat ketat dalam rilis terbarunya dan sekarang digunakan untuk semua versi Android. Kesalahan aapt yang Anda dapatkan dihasilkan karena tidak lagi memungkinkan penspesifikasi format non-posisional .

Berikut adalah beberapa ide bagaimana Anda dapat memasukkan% -simbol dalam string sumber daya Anda.

Jika Anda tidak memerlukan penentu format atau pengganti dalam string, Anda cukup menggunakan formattedatribut dan mengaturnya menjadi false:

<string formatted="false">%a + %a == 2%a</string>

Dalam hal ini string tidak digunakan sebagai string format untuk Formattersehingga Anda tidak perlu melarikan diri% -simbol Anda. String yang dihasilkan adalah "% a +% a == 2% a".

Jika Anda menghilangkan formatted="false"atribut, string digunakan sebagai string format dan Anda harus melarikan diri dari% -simbol. Ini dilakukan dengan benar dengan double-%:

<string>%%a + %%a == 2%%a</string>

Sekarang aaptmemberi Anda tidak ada kesalahan tetapi tergantung pada bagaimana Anda menggunakannya, string yang dihasilkan bisa menjadi "%% a + %% a == 2 %% a" jika a Formatterdipanggil tanpa argumen format apa pun :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

Tanpa xml dan kode apa pun, sulit untuk mengatakan apa sebenarnya masalah Anda, tetapi mudah-mudahan ini membantu Anda memahami mekanisme sedikit lebih baik.

Josef Pfleger
sumber
1
saya memilih ini sebagai jawaban karena itu harus bekerja, tetapi ternyata ada bug yang saya temui dengan string itu, jadi ive memutuskan untuk menggunakan %% dan "XXX.replaceAll (" %% ","% ");"
zaid
4
menggunakan formatted = false berfungsi dengan baik. Ini adalah bagaimana saya menggunakannya: <string name = "information_description" formatted = "false"> \ 'Sweet \' 10% hingga 20% bahkan 35% gula berat </string>
Seseorang di suatu tempat
1
diformat = salah bekerja dengan baik untuk saya juga. Menggunakan %%, itu benar-benar muncul sebagai %% di perangkat dan emulator saya ..
samwize
diformat = salah bekerja dengan baik untuk saya di masa lalu. sekarang (22 ADT), untuk beberapa alasan tidak. dan jika saya menggunakan: "str = mContext.getString (R.string.str," hello ")", ia akan memiliki peringatan serat ini: "Format string 'str' bukan format string yang valid sehingga tidak boleh diteruskan ke String.format "
pengembang android
1
Jika Anda mengakses dari <string-array />, maka untuk mencetak persentase gunakan \ u0025. Ini berhasil untuk saya.
Chintan Shah
157

Untuk mengizinkan aplikasi menggunakan string yang diformat dari sumber daya, Anda harus memperbaiki xml Anda. Jadi misalnya

<string name="app_name">Your App name, ver.%d</string>

harus diganti dengan

<string name="app_name">Your App name, ver.%1$d</string>

Anda dapat melihat ini untuk detailnya.

Paul E.
sumber
2
Terima kasih, Anda memberikan tautan yang hilang - secara harfiah.
akauppi
22
Untuk penggantian beberapa parameter (misalnya dengan string), gunakan %1$s, %2$sdll.
CJBS
1
siapa yang akan membaca jawaban besar untuk hal kecil ini? Terima kasih, saya gulir ke bawah untuk menemukan Anda.
Janaka R Rajapaksha
73

Anda dapat melarikan diri% menggunakan %% untuk parser XML, tetapi ditampilkan dua kali di perangkat.

Untuk menampilkannya sekali, coba format berikut: \%%

Sebagai contoh

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

ditampilkan Fat Burning (50% to 60%)di perangkat

pavblazek
sumber
6
\ %% menyebabkan kerusakan pada Nexus 4 4.2.1. Belum menguji yang lain.
Jon Willis
Ini berfungsi dengan baik dan mudah ketika Anda sudah tahu persen yang ingin Anda sertakan ke dalam string Anda, dibandingkan dengan menggunakan formatter string dan selalu harus menetapkan nilai-nilai hardcoded secara terprogram.
portfoliobuilder
Ini macet untuk saya juga pada Nexus 5.1.1. @ViliusK jawaban adalah yang benar.
Chan Jing Hong
2
cukup gunakan %% daripada%
Sundeep1501
37

Menggunakan

<string name="win_percentage">%d%% wins</string>

mendapatkan

80% wins sebagai string yang diformat.

Saya menggunakan String.format()metode untuk memasukkan nomor %d.

ViliusK
sumber
12

Dalam file strings.xml Anda, Anda dapat menggunakan tanda Unicode yang Anda inginkan.

Misalnya, nomor Unicode untuk tanda persen adalah 0025:

<string name="percent_sign">&#x0025;</string>

Anda dapat melihat daftar lengkap tanda Unicode di sini

Asaf Pinhassi
sumber
1
Itu tidak masuk akal. & # x0025; dan% identik dalam file xml.
BeniBela
File sumber daya dikonversi menjadi sumber daya Java, dan dengan demikian, %karakter kembali. Saya khawatir ini tidak menyelesaikan masalah.
Paul Lammertsma
9

untuk keluar dari simbol persen, Anda hanya perlu %%

sebagai contoh :

String.format("%1$d%%", 10)

mengembalikan "10%"

landerlyoung
sumber
1
Jawaban Anda hampir sama dengan beberapa jawaban lain yang ada
Ben Rhys-Lewis
... dan salah, karena pengembalian 10%tidak %10. FIY: Ketika Anda menggunakan, String.formatAnda harus setiap kali menentukan Lokal. Anda dapat benar-benar terkejut ketika Anda tidak menempatkan Lokal dan menggunakan bahasa Arab untuk nomor format ...
mtrakal
7

Bukan masalah Anda melainkan masalah serupa.

Jika Anda memiliki lebih dari satu pemformatan di entri string Anda, Anda tidak boleh menggunakan "% s" beberapa kali.

JANGAN LAKUKAN:

<string name="entry">Planned time %s - %s (%s)</string>

LAKUKAN:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
Garytech
sumber
5

Anda dapat keluar dari% dalam xml dengan %%, tetapi Anda perlu mengatur teks dalam kode, bukan dalam tata letak xml.

Mee
sumber
1
Ya itu lolos dengan dobel%, dan kompilasi dengan baik. Tetapi ketika dijalankan pada emulator, atau bahkan perangkat, itu bisa muncul sebagai %%.
samwize
5

Ini bisa menjadi kasus IDE menjadi terlalu ketat.

Idenya bagus, secara umum Anda harus menentukan urutan variabel substitusi sehingga jika Anda menambahkan sumber daya untuk bahasa lain, kode java Anda tidak perlu diubah. Namun ada dua masalah dengan ini:

Pertama, string seperti:

You will need %.5G %s

untuk digunakan karena Anda akan membutuhkan 2,1200 mg akan memiliki urutan yang sama dalam bahasa apa pun karena jumlah massa selalu ditampilkan dalam urutan itu secara ilmiah.

Yang kedua adalah bahwa jika Anda menempatkan urutan variabel dalam bahasa apa pun sumber daya default Anda ditentukan dalam (misalnya bahasa Inggris) maka Anda hanya perlu menentukan posisi dalam rangkaian sumber daya untuk bahasa, gunakan urutan berbeda dengan bahasa default Anda.

Berita baiknya adalah ini mudah diperbaiki. Meskipun tidak perlu menentukan posisi, dan IDE terlalu ketat, cukup tentukan saja. Untuk contoh di atas gunakan:

Anda membutuhkan% 1 $ .5G% 2 $ s

Steve Waring
sumber
4

Metode rumit: menggunakan tanda persen kecil seperti di bawah ini

 <string name="zone_50">Fat Burning (50&#65130; to 60&#65130;)</string> 

Tanda Persen di Wikipedia

Bao Le
sumber
3

Coba yang ini (kanan):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>
sonida
sumber
-1

Misalkan Anda ingin menampilkan (50% OFF) dan masukkan 50 pada saat runtime. Ini kodenya:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

Di kelas java gunakan kode ini:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);
Harish Rana
sumber
-16

Coba gunakan backslash di depannya, seperti di bawah ini:

\%
lolraccoon
sumber
Solusi ini menyebabkan crash.
Prinkal Kumar