2013-04-05 30 views
6

Tôi đang sử dụng chuỗi số nhiều do android-sdk cung cấp. Tôi đã sử dụng đoạn mã sau để tạo ra một chuỗi số nhiều:Số nhiều không hoạt động như dự định trong android

<plurals name="valuestr"> 
     <item quantity="zero">Choose a value.</item> 
     <item quantity="one">%d unit.</item> 
     <item quantity="other">%d units.</item> 
    </plurals> 

Java Code:

textView.setText(getResources().getQuantityString(R.plurals.valuestr,0,0)); 

Khi tôi đang cài đặt bất kỳ giá trị khác hơn là '0', điều này đang làm việc tốt nhưng khi tôi đang thiết " 0 'nó đang hiển thị ' 0 đơn vị '..

Vui lòng trợ giúp!

Cập nhật

Trong khi tìm kiếm nhiều trên internet tôi đã xem qua một workaround trong đó sử dụng java.text.MessageFormat lớp:

<resources> 
    <string name="item_shop">{0,choice,0#No items|1#One item|1&lt;{0} items}</string> 
</resources> 

Sau đó, từ các mã tất cả các bạn phải làm là như sau:

String fmt = resources.getText(R.string.item_shop); 
textView.setText(MessageFormat.format(fmt, amount)); 

Bạn có thể đọc thêm về các chuỗi định dạng trong javadocs for MessageFormat

+0

Tôi có thể nói nó có thể là bởi vì bạn cung cấp cho nó một định dạngArgs (0 cuối cùng), có thể lọc mục số nhiều để chỉ giữ lại những mục yêu cầu định dạng args – njzk2

+0

có thể trùng lặp của [getQuantityString trả về chuỗi sai với giá trị 0] (http://stackoverflow.com/questions/13493011/getquantitystring-returns-wrong-string-với-0-value) – rds

Trả lời

8

Bài đăng gần đây đã được thực hiện trên G + về điều này. Trong ngắn hạn, đó là bởi vì điều này sẽ không chọn trận đấu gần nhất bởi Integer (0 = 0), nhưng bởi vì nó sẽ tìm kiếm tốt nhất ngữ pháp chọn.

Trong ví dụ của bạn, bạn sử dụng các đơn vị. Cách sử dụng chính xác sẽ là; 0 đơn vị 1 đơn vị 2 đơn vị

Lập, không tương đương với khá nhiều bất kỳ số lượng khác trên 1

Đọc toàn bộ câu chuyện ở đây; https://plus.google.com/116539451797396019960/posts/VYcxa1jUGNo

+2

Trích từ chủ đề đó: * Cố gắng sử dụng 'zero' để đại diện cho" không có mục "là một lỗ hổng phổ biến. Vấn đề cũng là ADT chấp nhận nó cho ngôn ngữ mà nó không áp dụng, ví dụ bằng tiếng Anh * –

+0

cảm ơn câu trả lời! – mudit

0

Số nhiều được xác định trong <plurals> các phần của tệp tài nguyên chỉ được sử dụng cho một sự khác biệt về mặt ngữ pháp đối với chuỗi số ít/số nhiều. Bạn không nên sử dụng chúng cho logic hiển thị khác, như bạn đã làm. Thay vào đó, bạn nên thêm một số logic kiểm tra vào mã của mình.

Các Android developer's guide nêu rõ điều này:

Mặc dù lịch sử gọi là "chuỗi số lượng" (và vẫn gọi đó trong API), chuỗi số lượng nên chỉ được sử dụng cho số nhiều. Nó sẽ là một sai lầm khi sử dụng chuỗi số lượng để triển khai một số nội dung như "Hộp thư đến" của Gmail so với "Hộp thư đến" (12) "" khi có thư chưa đọc, ví dụ . Có vẻ thuận tiện khi sử dụng chuỗi số thay vì câu lệnh if, nhưng điều quan trọng cần lưu ý là một số ngôn ngữ (chẳng hạn như là tiếng Trung) không tạo ra những khác biệt ngữ pháp này, vì vậy, bạn sẽ luôn nhận được chuỗi khác.

Giải pháp thay thế của bạn - mặc dù không hoạt động như một giải pháp sạch, theo ý kiến ​​của tôi.Các yêu cầu kinh doanh trong tương lai có thể làm cho nó cần thiết để bao gồm logic phức tạp hơn là chỉ hiển thị một văn bản khác. Hoặc bạn có thể có một chuỗi "không có mục được chọn" chung trong tệp tài nguyên của bạn được sử dụng tại các vị trí khác nhau, chỉ có thể được sử dụng lại nếu bạn không tuân theo giải pháp của mình.

Nói chung, tôi sẽ tránh sử dụng hai kỹ thuật định dạng khác nhau (String.format phong cách định dạng %d vs MessageFormat phong cách định dạng {0} và chọn một mà bạn muốn dính vào toàn bộ ứng dụng của bạn.

Các vấn đề liên quan