Bạn có thể đã phát hiện ra rằng lỗi này sẽ xảy ra khi chúng tôi đang cố gắng để thiết lập một số nguyên như là một chuỗi như: nơi nào đó trong mã some_variable
được khai báo là int
và sau đó nó cố gắng để thiết lập nó để some_textview
sử dụng setText()
phương pháp:
int some_variable = 0;
TextView some_textview = (TextView) findViewById(R.id.someTextView);
... some code/calculations etc...
some_textview.setText(some_variable); // exception! some_variable is an int value
cũng nó có thể là một kết quả được trả về bởi bất kỳ phương pháp mà trả về int kết quả là, như:
some_textview.setText(someString.length());// exception! String.length() returns an int value
some_textview.setText(someSet.size());// exception! Set.size() returns an int value
, vv
những nguyên nhân này gây ra Resources$NotFoundException
cuz không có tài nguyên String
với số (id) đó. R.java
có các biến tĩnh trong đó mỗi số String
có số duy nhất của riêng nó (id và bạn sử dụng số đó trong mã là R.string. id). Nó có thể xảy ra rằng cuối cùng some_variable
sẽ có một số hợp lệ nhưng trong trường hợp này người dùng sẽ thấy một chuỗi văn bản sai trong some_textview
.
Giải pháp cho vấn đề này là đơn giản (nếu giá trị some_variable
's phải được hiển thị):
some_textview.setText(String.valueOf(some_variable));
Ngoài ra còn có một số người đang cố gắng để thiết lập giá trị int
theo cách tương tự vào tin nhắn Toast
như:
int some_variable = 0;
... some code/calculations etc...
Toast.makeText(this, some_variable, Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), someSet.size(), Toast.LENGTH_LONG).show();
việc sửa chữa là như nhau:
int some_variable = 0;
... some code/calculations etc...
Toast.makeText(this, String.valueOf(some_variable), Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), String.valueOf(some_Set.size()), Toast.LENGTH_LONG).show();
Bạn có thể gặp các bản sửa lỗi sử dụng phương thức Integer(some_variable).toString()
. Không tệ. Tuy nhiên, điều này có nghĩa là chỉ có thể sử dụng giá trị số nguyên (hoặc NumberFormatException
) so với String.valueOf(some_variable)
không quan trọng vì nó hoạt động với bất kỳ loại giá trị nào, bao gồm tất cả các giá trị nguyên thủy (float, double, bytes, long etc) và sẽ không bao giờ ném bất kỳ ngoại lệ nào.
Nhưng có một số trường hợp khác. The rare cases are described here và vấn đề là làm sạch dự án trong Eclipse.
Trong trường hợp nếu bạn khá chắc chắn bạn không vượt qua bất kỳ số nào với phương thức chấp nhận String
và hơn thế nữa điều này xảy ra với một ứng dụng được phát hành (và không xảy ra trong khi phát triển) có thể là trường hợp ứng dụng của bạn có Locale
phụ thuộc vào tài nguyên String
. Và khi bạn đã thử nghiệm nó, bạn có thể đã làm nó bằng cách sử dụng thiết bị Locale
cụ thể của khu vực của bạn để không có vấn đề đã được phát hiện. Tuy nhiên trong trường hợp này, bạn nên cung cấp mặc định strings.xml
nằm trong thư mục res\values
của dự án. Nếu bạn bỏ lỡ, điều này có thể là trường hợp.Nếu một số người dùng, cho phép nói, từ một nước Đức người là mặc định Locale
được DE cố gắng để chạy ứng dụng như vậy (mà chỉ có strings.xml
trong các thư mục như values-en
, values-it
vv nhưng không có strings.xml
trong values
cũng không phải trong values-de
thư mục) sẽ bắt một vụ tai nạn với Resources$NotFoundException
.
Khắc phục sự cố này, như tôi đã đề cập trước đó, cung cấp thư mục mặc định trong res\values
của dự án hoặc để đảm bảo (ví dụ trong ứng dụng được mở rộng) ứng dụng của bạn đang đặt ngôn ngữ mặc định phù hợp cho ứng dụng của bạn chạy trên thiết bị có ngôn ngữ không được hỗ trợ, như:
Locale locale = getAppLocale(context);
String localeLang = locale.getLanguage();
// default locale is EN but available are EN and RU
if (!localeLang.equalsIgnoreCase("en") && !localeLang.equalsIgnoreCase("ru"))
locale = new Locale("en");
Configuration config = new Configuration();
config.locale = locale;
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
Hoàn hảo! của tôi là trường hợp thư mục ngôn ngữ! – Prachi