Biểu tượng phần trăm XML của Android


309

Tôi có một chuỗi các chuỗi trong đó %biểu tượng được sử dụng. Định dạng thích hợp để sử dụng %%. Khi tôi có một chuỗi trong mảng đó với nhiều chuỗi, %nó sẽ cho tôi lỗi này.

 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
Bạn có thể đăng XML gây ra lỗi này không? Có thể rất khó để xác định một vấn đề mà không thấy nguyên nhân.
Chris Cashwell

đây là một lỗi có thể dễ dàng được sao chép bởi bất kỳ chuỗi nào có 2 ký hiệu% trở lên.
trả tiền

Nếu không tìm kiếm mục đích định dạng, cách tốt hơn để thực hiện.
Shishir Gupta

Trong trường hợp của tôi, tôi đã nhập sai định dạng param là 1% $ s, thay vì% 1 $ s.
Ashokchakravarthi Nagarajan

Câu trả lời:


467

Công cụ đóng gói tài sản Android ( aapt) đã trở nên rất nghiêm ngặt trong phiên bản mới nhất và hiện được sử dụng cho tất cả các phiên bản Android. Lỗi aapt mà bạn nhận được được tạo vì nó không còn cho phép các chỉ định định dạng không định vị .

Dưới đây là một vài ý tưởng về cách bạn có thể bao gồm% -symbol trong chuỗi tài nguyên của mình.

Nếu bạn không cần bất kỳ định dạng hoặc thay thế định dạng nào trong chuỗi của mình, bạn chỉ cần sử dụng formattedthuộc tính và đặt thành false:

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

Trong trường hợp này, chuỗi không được sử dụng làm chuỗi định dạng Formatterđể bạn không phải thoát% -symbols của mình. Chuỗi kết quả là "% a +% a == 2% a".

Nếu bạn bỏ qua formatted="false"thuộc tính, chuỗi được sử dụng làm chuỗi định dạng và bạn phải thoát% -symbols. Điều này được thực hiện chính xác với double-%:

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

Bây giờ aaptcung cấp cho bạn không có lỗi nhưng tùy thuộc vào cách bạn sử dụng nó, chuỗi kết quả có thể là "%% a + %% a == 2 %% a" nếu a Formatterđược gọi mà không có bất kỳ đối số định dạng nào :

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"

Không có bất kỳ xml và mã nào, thật khó để nói chính xác vấn đề của bạn là gì nhưng hy vọng điều này sẽ giúp bạn hiểu các cơ chế tốt hơn một chút.


1
Tôi đã chọn đây là câu trả lời vì nó sẽ hoạt động, nhưng rõ ràng có một lỗi tôi đang gặp phải với chuỗi đó, vì vậy tôi đã quyết định sử dụng %% và "XXX.replaceAll (" %% ","% ");"
trả lời

4
sử dụng định dạng = false hoạt động độc đáo. Đây là cách tôi đã sử dụng: <string name = "information_description" formatted = "false"> \ 'Sweet \' 10% đến 20% thậm chí 35% đường theo trọng lượng </ string>
Ai đó ở đâu đó vào

1
định dạng = false hoạt động độc đáo cho tôi quá. Sử dụng %%, nó thực sự hiển thị dưới dạng %% trên thiết bị và trình giả lập của tôi ..
lấy mẫu vào

định dạng = false làm việc tốt cho tôi trong quá khứ. bây giờ (ADT 22), vì một số lý do, nó không. và nếu tôi sử dụng: "str = mContext.getString (R.opes.str," hello ")", nó sẽ có cảnh báo lint này: "Chuỗi định dạng 'str' không phải là chuỗi định dạng hợp lệ nên không được chuyển đến String.format "
nhà phát triển Android

1
Nếu bạn đang truy cập từ <chuỗi-mảng />, thì để in tỷ lệ phần trăm, hãy sử dụng \ u0025. Điều này làm việc cho tôi.
Chintan Shah

157

Để cho phép ứng dụng sử dụng các chuỗi được định dạng từ các tài nguyên, bạn nên sửa xml của mình. Ví dụ

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

nên được thay thế bằng

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

Bạn có thể thấy điều này để biết chi tiết.


2
Cảm ơn, bạn đã cung cấp các liên kết còn thiếu - theo nghĩa đen.
akauppi

22
Để thay thế nhiều tham số (ví dụ: bằng chuỗi), hãy sử dụng %1$s, %2$sv.v.
CJBS

1
Ai sẽ đọc một câu trả lời lớn như vậy cho điều nhỏ bé này? Cảm ơn, tôi cuộn xuống để tìm bạn.
Janaka R Rajapaksha

73

Bạn có thể thoát% bằng %% cho trình phân tích cú pháp XML, nhưng nó được hiển thị hai lần trong thiết bị.

Để hiển thị một lần, hãy thử định dạng sau: \%%

Ví dụ

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

được hiển thị như Fat Burning (50% to 60%)trong thiết bị


6
\ %% gây ra sự cố trên Nexus 4 4.2.1. Không thử nghiệm người khác.
Jon Willis

Điều này hoạt động tốt và dễ dàng khi bạn đã biết phần trăm bạn muốn đưa vào chuỗi của mình, so với sử dụng trình định dạng chuỗi và luôn phải đặt các giá trị được mã hóa cứng đó theo chương trình.
portfoliobuilder

Điều này cũng đã xảy ra với tôi trên Nexus 5.1.1. Câu trả lời @ViliusK là đúng.
Chan Jing Hong

2
chỉ cần sử dụng %% thay vì%
Sundeep1501

37

Sử dụng

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

để có được

80% wins như một chuỗi định dạng.

Tôi đang sử dụng String.format()phương pháp để lấy số được chèn thay vì %d.


12

Trong tệp String.xml của bạn, bạn có thể sử dụng bất kỳ ký hiệu Unicode nào bạn muốn.

Ví dụ: số Unicode cho ký hiệu phần trăm là 0025:

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

Bạn có thể xem danh sách đầy đủ các dấu hiệu Unicode tại đây


1
Điều đó không có ý nghĩa gì cả. & # x0025; và% giống hệt nhau trong tệp xml.
BeniBela

Tệp tài nguyên được chuyển đổi thành tài nguyên Java và khi làm như vậy, %ký tự trả về. Tôi sợ điều này không giải quyết được vấn đề.
Paul Lammertsma

9

để thoát biểu tượng phần trăm, bạn chỉ cần %%

ví dụ :

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

trả về "10%"


1
Câu trả lời của bạn khá giống với một số câu trả lời hiện có khác
Ben Rhys-Lewis

... Và sai, vì trả về 10%không %10. FIY: Khi bạn sử dụng, String.formatbạn nên luôn luôn chỉ định Locale. Bạn có thể thực sự ngạc nhiên khi bạn không đặt Locale và sử dụng ngôn ngữ Ả Rập cho các số định dạng ...
mtrakal

7

Không chính xác vấn đề của bạn nhưng một vấn đề tương tự.

Nếu bạn có nhiều định dạng trong mục nhập chuỗi của mình, bạn không nên sử dụng "% s" nhiều lần.

KHÔNG:

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

LÀM:

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

5

Bạn có thể thoát% trong xml bằng %%, nhưng bạn cần đặt văn bản theo mã, không phải theo bố cục xml.


1
Có, nó thoát với gấp đôi%, và biên dịch độc đáo. Nhưng khi chạy trên trình giả lập, hoặc thậm chí các thiết bị, nó có thể hiển thị dưới dạng %%.
lấy mẫu

5

Đây có thể là một trường hợp IDE trở nên quá nghiêm ngặt.

Ý tưởng là âm thanh, nói chung, bạn nên chỉ định thứ tự của các biến thay thế để nếu bạn thêm tài nguyên cho ngôn ngữ khác, mã java của bạn sẽ không cần phải thay đổi. Tuy nhiên, có hai vấn đề với điều này:

Thứ nhất, một chuỗi như:

You will need %.5G %s

để được sử dụng vì Bạn sẽ cần 2,1200 mg sẽ có thứ tự giống nhau trong bất kỳ ngôn ngữ nào vì khối lượng đó luôn được biểu diễn theo thứ tự đó một cách khoa học.

Thứ hai là nếu bạn đặt thứ tự các biến trong ngôn ngữ bao giờ thì tài nguyên mặc định của bạn được chỉ định bằng (ví dụ tiếng Anh) thì bạn chỉ cần chỉ định các vị trí trong chuỗi tài nguyên cho các ngôn ngữ, sử dụng một thứ tự khác với ngôn ngữ mặc định của bạn.

Tin tốt là điều này là đơn giản để sửa chữa. Mặc dù không cần chỉ định các vị trí và IDE đang quá nghiêm ngặt, chỉ cần xác định chúng bằng mọi cách. Đối với ví dụ trên sử dụng:

Bạn sẽ cần% 1 $ .5G% 2 $ s



3

Hãy thử cái này (phải):

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


-1

Giả sử bạn muốn hiển thị (GIẢM 50%) và nhập 50 khi chạy. Đây là mã:

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

Trong lớp java sử dụng mã này:

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

-16

Hãy thử sử dụng dấu gạch chéo ngược phía trước nó, như bên dưới:

\%

Giải pháp này dẫn đến sự cố.
Prinkal Kumar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.