Android: android.content.res.Resource $ NotFoundException: ID tài nguyên chuỗi # 0x5


158

Tôi nhận được ngoại lệ từ tiêu đề khi tôi chạy ứng dụng của mình. Những gì nó làm là nó có tệp .txt với các từ cho trò chơi Hangman và tôi nghĩ ngoại lệ được ném khi truy cập tệp. Tệp của tôi, cuvinte.txt được đặt vào / nội dung /. Đây là mã của tôi (tôi đã bỏ qua phần layout / xml, hoạt động tốt):

public void onCreate() {
    // all the onCreate() stuff, then this:
    try {
        AssetManager am = this.getAssets();
        InputStream is = am.open("cuvinte.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(is);
        BufferedReader b = new BufferedReader(inputStreamReader);
        String rand;
        while((rand=b.readLine())!=null){
            cuvinte.add(rand);
        }
    } catch (IOException e) {
        Toast.makeText(this, "No words file", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

    newGame(newG);
}

public void newGame(View view){
    Random rand = new Random();
    String stringCuvant = cuvinte.get(rand.nextInt(cuvinte.size()));
    cuvant.setText("");
    System.out.println(stringCuvant);
    for(int i = 0; i< stringCuvant.length(); i++){
        cuvant.append("_ ");
    }
    incercari.setText(valIncercari);
}

Hàm newGame () được gọi cả khi nhấn nút trò chơi mới và khi bắt đầu hoạt động, trong hàm onCreate ().


bạn nên đóng những độc giả đó sau khi bạn hoàn thành với họ
Gubatron

1
Vì mục đích chuyên nghiệp, vui lòng đặt tên cho các biến của bạn bằng tiếng Anh :)
Matei Suica

1
Trong trường hợp của tôi, tôi đã trải nghiệm điều này bởi vì tôi đang cố gắng truyền một tham số int bên trong một setText()hàm.
TASlim Oseni

Câu trả lời:


548

(Chỉ cần giả định, ít thông tin hơn về ngoại lệ stacktrace)

Tôi nghĩ rằng, dòng này, incercari.setText(valIncercari);ném Ngoại lệ vì valIncercariint

Nên nó phải là,

incercari.setText(valIncercari+"");

Hoặc là

incercari.setText(Integer.toString(valIncercari));

15
hoặc thậm chí tốt hơn:Integer.toString(valIncercari);
Jave

6
giống như String.valueOf (); trong đó gọi Integer.toString và các phương thức toString tương ứng khác
Jan Rabe

4
Tôi tự hỏi tại sao Android Studio không tư vấn cho bạn. Tôi gặp vấn đề tương tự khi đặt một giá trị int vào TextView.setText bị lỗi.
bheatcoker

2
@bheatcoker - bởi vì setText(int)cũng được sử dụng để lấy tài nguyên chuỗi theo id. Và trong Android tất cả id tài nguyên đều có intgiá trị.
user370305

1
String.format là cách được đề xuất. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

Chỉ muốn chỉ ra một lý do khác mà lỗi này có thể được đưa ra là nếu bạn đã xác định tài nguyên chuỗi cho một bản dịch của ứng dụng của mình nhưng không cung cấp tài nguyên chuỗi mặc định.

Ví dụ về vấn đề:

Như bạn có thể thấy bên dưới, tôi đã có một tài nguyên chuỗi cho một chuỗi tiếng Tây Ban Nha "get_started". Nó vẫn có thể được tham chiếu trong mã, nhưng nếu điện thoại không phải tiếng Tây Ban Nha, nó sẽ không có tài nguyên để tải và gặp sự cố khi gọi getString().

giá trị-es / chuỗi.xml

<string name="get_started">SIGUIENTE</string>

Tham chiếu đến tài nguyên

textView.setText(getString(R.string.get_started)

Đăng nhập:

06-11 11:46:37.835    7007-7007/? E/AndroidRuntime FATAL EXCEPTION: main
Process: com.app.test PID: 7007
android.content.res.Resources$NotFoundException: String resource ID #0x7f0700fd
        at android.content.res.Resources.getText(Resources.java:299)
        at android.content.res.Resources.getString(Resources.java:385)
        at com.juvomobileinc.tigousa.ui.signin.SignInFragment$4.onClick(SignInFragment.java:188)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Giải pháp cho vấn đề

Ngăn chặn điều này khá đơn giản, chỉ cần đảm bảo rằng bạn luôn có tài nguyên chuỗi mặc định values/strings.xmlđể nếu điện thoại ở ngôn ngữ khác, nó sẽ luôn có tài nguyên để quay lại.

giá trị / chuỗi.xml

<string name="get_started">Get Started</string>

giá trị-en / chuỗi.xml

<string name="get_started">Get Started</string>

giá trị-es / chuỗi.xml

<string name="get_started">Siguiente</string>

giá trị-de / chuỗi.xml

<string name="get_started">Ioslegen</string>

Lần này xảy ra khi tôi sao chép tài nguyên từ một dự án Android Studio sang dự án khác và tôi đã sao chép tệp String.xml. Do một số bộ nhớ đệm / tải lại / bất cứ điều gì nó đã loại bỏ tệp mới và giữ lại tệp cũ. Vì vậy, tôi đã có id chuỗi từ bản dịch nhưng không phải từ chuỗi StringDB đơn giản
denispyr

14

Một kịch bản khác có thể gây ra ngoại lệ này là với DataBinding, đó là khi bạn sử dụng một cái gì đó như thế này trong bố cục của bạn

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="model"
            type="point.to.your.model"/>
    </data>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@{model.someIntegerVariable}"/>

</layout>

Lưu ý rằng biến tôi đang sử dụng là một số nguyên và tôi đang gán nó cho trường văn bản của TextView. Vì TextView đã có một phương thức có chữ ký của setText(int)nó, nó sẽ sử dụng phương thức này thay vì sử dụng setText(String)và truyền giá trị. Do đó, TextView nghĩ số đầu vào của bạn là giá trị tài nguyên rõ ràng là không hợp lệ.

Giải pháp là truyền giá trị int của bạn thành chuỗi như thế này

android:text="@{String.valueOf(model.someIntegerVariable)}"

Cảm ơn, nó đã giúp. Ngoài ra, sau đó bạn cần phải Build-> Clean Projecttrong Android Studio để tạo lại các lớp Binding dữ liệu.
Yamashiro Rion

9

Vấn đề này chủ yếu xảy ra do lỗi trong setText()phương thức

Giải pháp đơn giản là đặt Integergiá trị của bạn bằng cách chuyển đổi thành stringloại như

textview.setText(Integer.toString(integer_value));

1

Đôi khi điều này xảy ra do không thích bất kỳ nguồn nào như nếu tôi muốn đặt văn bản thành một chế độ xem văn bản từ bộ điều hợp thì tôi nên sử dụng

 textView.setText(""+name);

Nếu bạn viết một cái gì đó như

 textView.setText(name);

điều này sẽ không hoạt động và đôi khi chúng ta không tìm thấy tài nguyên từ tệp string.xml thì loại lỗi này xảy ra.


0

Sử dụng DataBinding và đặt nền cho edittext với các tài nguyên từ thư mục drawable gây ra ngoại lệ.

<EditText
                            android:background="@drawable/rectangle"
                            android:imeOptions="flagNoExtractUi"
                            android:layout_width="match_parent"
                            android:layout_height="45dp"
                            android:hint="Enter Your Name"
                            android:gravity="center"
                            android:textColorHint="@color/hintColor"
                            android:singleLine="true"
                            android:id="@+id/etName"
                            android:inputType="textCapWords"
                            android:text="@={viewModel.model.name}"
                            android:fontFamily="@font/avenir_roman"/>

Giải pháp

Tôi chỉ cần thay đổi nền từ android:background="@drawable/rectangle"đến android:background="@null"

Làm sạch và xây dựng lại dự án.


-1

Bạn đang chỉ định một giá trị số cho trường văn bản. Bạn phải chuyển đổi giá trị số thành chuỗi bằng:

String.valueOf(variable)
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.