Android XML Yüzde Sembolü


309

Ben %sembolün kullanıldığı dizeleri bir dizi var . Kullanmak için uygun biçim %IS %. Ben bu dizide birden çok ile bir dize olduğunda %bana bu hatayı verir.

 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

6
Bu hataya neden olan XML'i gönderebilir misiniz? Bir problemin sebebini görmeden tanımlanması çok zor olabilir.
Chris Cashwell

bu,% 2 veya daha fazla sembol içeren herhangi bir dizeyle kolayca çoğaltılabilen bir hatadır.
zaid

Biçimlendirme amacı aramıyorsanız, başarmanın daha iyi bir yolu .
Shishir Gupta

Benim durumumda, biçimlendirme parametresini% 1 $ s yerine yanlış% 1 $ s olarak girdim.
Ashokchakravarthi Nagarajan

Yanıtlar:


467

Android Varlık Paketleme Aracı ( aapt) son sürümünde çok katı hale geldi ve şimdi tüm Android sürümleri için kullanılıyor . Artık konumsal olmayan biçim belirleyicilerine izin vermediği için aldığınız aapt hatası oluşturulur .

% -Symbol kaynağını kaynak dizelerinize nasıl ekleyebileceğinize dair birkaç fikir.

Dizenizde herhangi bir biçim belirtecine veya değiştirmeye ihtiyacınız yoksa, formattedözniteliği kullanabilir ve şu şekilde ayarlayabilirsiniz false:

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

Bu durumda dize, bir format dizesi olarak kullanılmaz, Formatterbu nedenle% -symbols öğesinden kaçmanız gerekmez. Sonuçta elde edilen dize "% a +% a == 2% a" dır.

formatted="false"Özniteliği atlarsanız, dize bir biçim dizesi olarak kullanılır ve% -symbols'tan kaçmanız gerekir. Bu,% double ile doğru şekilde yapılır:

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

Şimdi aaptsize hata vermiyor, ancak nasıl kullandığınıza bağlı olarak, Formatterherhangi bir biçim bağımsız değişkeni olmadan çağrılırsa , elde edilen dize "%% a + %% a == 2 %% a" olabilir :

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"

Herhangi bir xml ve kod olmadan sorunun tam olarak ne olduğunu söylemek zor ama umarım bu mekanizmaları biraz daha iyi anlamanıza yardımcı olur.


1
i çalışmalıdır çünkü bu cevap olarak seçtim, ama görünüşe göre bu dize ile çalışan im bir hata var, bu yüzden ive %% ve "XXX.replaceAll (" %% ","% ");
zaid

4
formatlı = false kullanarak güzel çalışıyor. Bu Onu kullandım nasıl: <string name = "information_description" biçimlendirilmiş = "false"> \ 'Sweet \' % 10 ağırlıkla bile% 35 şeker,% 20 </ string>
Birisi bir yerde

1
formatted = false benim için de iyi çalışıyor. %% kullanarak, tam anlamıyla cihazımda ve emülatörde %% olarak ortaya çıktı ..
samwize

formatted = false geçmişte benim için iyi çalıştı. şimdi (ADT 22), nedense öyle değil. ve ben kullanırsam: "str = mContext.getString (R.string.str," merhaba ")", bu tüy bırakma uyarısına sahip olacaktır: "Biçim dizesi 'str' geçerli bir biçim dizgisi değildir, bu nedenle iletilmemelidir String.format "
android geliştirici

1
<String-array /> öğesinden erişiyorsanız, yazdırma yüzdesi için \ u0025 kullanın. Bu benim için çalıştı.
Chintan Shah

157

Uygulamanın kaynaklardan biçimlendirilmiş dizeler kullanarak izin vermek için xml'nizi düzeltmeniz gerekir. Yani mesela

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

ile değiştirilmelidir

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

Görebilirsiniz Bu ayrıntılar için.


2
Teşekkürler, eksik bağlantıyı sağladınız - kelimenin tam anlamıyla.
akauppi

22
Çoklu parametre ikamesi için (örn. Dizelerle) %1$s, %2$svb.
Kullanın

1
kim bu küçük şey için böyle büyük bir cevap okuyacak? Teşekkürler, sizi bulmak için aşağı kaydırıyorum.
Janaka R Rajapaksha

73

XML ayrıştırıcısı için %% kullanarak% 'dan kaçabilirsiniz, ancak cihazda iki kez gösterilir.

Bir kez göstermek için aşağıdaki biçimi deneyin: \%%

Örneğin

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

Fat Burning (50% to 60%)cihazdaki gibi gösterilir


6
\ %% Nexus 4 4.2.1'de çökmelere neden oluyor. Başkalarını test etmedim.
Jon Willis

Dize biçimlendiricisini kullanmak ve her zaman bu sabit kodlanmış değerleri programlı olarak ayarlamak zorunda kalmak yerine, dizelerinize eklemek istediğiniz yüzdeyi zaten bildiğinizde bu iyi çalışır ve kolaydır.
portföy geliştiricisi

Bu benim için de Nexus 5.1.1'de çöktü. @ViliusK yanıtı doğru.
Chan Jing Hong

2
% yerine %% kullan
Sundeep1501

37

kullanım

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

almak

80% wins biçimlendirilmiş dize olarak.

String.format()Numara yerine yerine almak için yöntem kullanıyorum %d.


12

Strings.xml dosyanızda istediğiniz Unicode işaretini kullanabilirsiniz.

Örneğin, yüzde işareti için Unicode numarası 0025:

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

Unicode işaretlerinin kapsamlı bir listesini burada görebilirsiniz


1
Bu hiç mantıklı değil. & # x0025; ve% bir xml dosyasında aynıdır.
BeniBela

Kaynak dosya bir Java kaynağına dönüştürülür ve böylece %karakter geri döner. Korkarım bu sorunu çözmez.
Paul Lammertsma

9

yüzde sembolünden kaçmak için sadece %%

Örneğin :

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

"% 10" döndürür


1
Cevabınız diğer mevcut cevaplarla hemen hemen aynı
Ben Rhys-Lewis

... ve yanlış, geri dönüşler nedeniyle 10%değil %10. FIY: Kullandığınızda String.formather zaman Yerel Ayar'ı belirtmelisiniz. Yerel ayar
koymadığınız

7

Sorununuz tam olarak değil, benzer bir sorun.

Dize girişinizde birden fazla biçimlendirme varsa "% s" öğesini birden çok kullanmamalısınız.

YAPMAYIN:

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

YAPMAK :

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

5

%% ile xml içinde% 'den kaçabilirsiniz, ancak metni xml düzeninde değil kodda ayarlamanız gerekir.


1
Evet,% çift ile kaçıyor ve güzel bir şekilde derleniyor. Ancak emülatörde veya hatta cihazlarda çalıştırıldığında %% olarak görünebilir.
samwize

5

Bu, IDE'nin çok katı hale gelmesine neden olabilir.

Fikir sağlamdır, genel olarak ikame değişkenlerinin sırasını belirtmelisiniz, böylece başka bir dil için kaynak eklemeniz gerektiğinde, java kodunuzun değiştirilmesi gerekmez. Ancak bununla ilgili iki sorun vardır:

İlk olarak, aşağıdaki gibi bir dize:

You will need %.5G %s

2.1200 mg ihtiyacınız olacak şekilde kullanılacak kitlenin bu miktarın daima bilimsel sırayla temsil edilmektedir olarak ısmarlayacak dilde aynı olacaktır.

İkincisi, değişkenlerin sırasını varsayılan kaynaklarınızın belirtildiği herhangi bir dilde (örneğin İngilizce) koyarsanız, yalnızca varsayılan dilde farklı bir düzen kullanan diller için kaynak dizelerindeki konumları belirtmeniz gerekir.

İyi haber, bunun düzeltilmesi basit olmasıdır. Konumları belirtmeye gerek olmamasına ve IDE'nin aşırı katı olmasına rağmen, bunları yine de belirtin. Yukarıdaki örnek için:

% 1 $ .5G% 2 $ s'ye ihtiyacınız olacak



3

Bunu deneyin (sağda):

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


-1

Göstermek istediğinizi varsayalım (% 50 İNDİRİM) ve çalışma zamanında 50 girin. İşte kod:

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

Java sınıfında şu kodu kullanın:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.