Android: android.content.res.Resources $ NotFoundException: ID sumber daya string # 0x5


158

Saya mendapatkan pengecualian dari judul ketika saya menjalankan aplikasi saya. Apa yang dilakukannya adalah memiliki file .txt dengan kata-kata untuk permainan Hangman dan saya pikir pengecualian dilemparkan ketika mengakses file. File saya, cuvinte.txt terletak di / assets /. Ini kode saya (saya melewatkan bagian layout / xml, yang berfungsi dengan baik):

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);
}

Fungsi newGame () dipanggil saat tombol game baru ditekan dan di awal aktivitas, di fungsi onCreate ().


Anda harus menutup pembaca itu setelah selesai dengan mereka
— Gubatron

1
Demi profesionalisme, sebutkan variabel Anda dalam bahasa Inggris :)
— Matei Suica

1
Dalam kasus saya, saya mengalami ini karena saya mencoba untuk melewatkan parameter int di dalam suatu setText()fungsi.
— Taslim Oseni

Jawaban:


548

(Asumsi saja, sedikit info tentang stacktrace Pengecualian)

Saya pikir, baris ini, incercari.setText(valIncercari);melempar Exception karena valIncercarimerupakanint

Jadi seharusnya demikian,

incercari.setText(valIncercari+"");

Atau

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

15
atau bahkan lebih baik:Integer.toString(valIncercari);
— Jave

6
sama seperti String.valueOf (); yang memanggil Integer.toString dan masing-masing metode toString lainnya
— Jan Rabe

4
Saya bertanya-tanya mengapa Android Studio tidak menyarankan Anda. Saya memiliki masalah yang sama dalam menetapkan nilai int ke TextView.setText untuk kesalahan.
— bheatcoker

2
@ bheatcoker - karena setText(int)juga digunakan untuk mendapatkan sumber daya string oleh id. Dan di Android, semua id sumber daya memiliki intnilai.
— user370305

1
String.format adalah cara yang disarankan. setText (String.format (Locale.US, "% d", valIncercari));
— Jeffrey

15

Hanya ingin menunjukkan alasan lain kesalahan ini dapat terjadi adalah jika Anda menetapkan sumber string untuk satu terjemahan aplikasi Anda tetapi tidak memberikan sumber string default.

Contoh Masalah:

Seperti yang Anda lihat di bawah, saya punya sumber string untuk string bahasa Spanyol "get_started". Itu masih bisa direferensikan dalam kode, tetapi jika telepon tidak dalam bahasa Spanyol tidak akan memiliki sumber daya untuk memuat dan crash saat menelepon getString().

values-es / strings.xml

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

Referensi sumber daya

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

Logcat:

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)

Solusi untuk Masalah ini

Mencegah ini cukup sederhana, pastikan Anda selalu memiliki sumber string default values/strings.xmlsehingga jika telepon menggunakan bahasa lain, ia akan selalu memiliki sumber daya untuk kembali.

values ​​/ strings.xml

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

values-en / strings.xml

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

values-es / strings.xml

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

values-de / strings.xml

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

Yang satu ini memukul ketika saya menyalin sumber daya dari satu proyek Android Studio ke yang lain dan saya menyalin file strings.xml. Karena beberapa caching / memuat ulang / apa pun itu membuang file baru dan menyimpan yang lama. Jadi saya mendapat id string dari terjemahan tetapi tidak dari string polos.xml
— denispyr

14

Skenario lain yang dapat menyebabkan pengecualian ini adalah dengan DataBinding, yaitu ketika Anda menggunakan sesuatu seperti ini di tata letak Anda

<?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>

Perhatikan bahwa variabel yang saya gunakan adalah Integer dan saya menugaskannya ke bidang teks dari TextView. Karena TextView sudah memiliki metode dengan tanda tangan setText(int)maka akan menggunakan metode ini alih-alih menggunakan setText(String)dan memberikan nilai. Dengan demikian TextView menganggap nomor input Anda sebagai nilai sumber daya yang jelas-jelas tidak valid.

Solusi adalah dengan memberikan nilai int Anda ke string seperti ini

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

Terima kasih, ini membantu. Juga setelah itu Anda perlu Build-> Clean Projectdi Android Studio untuk menghasilkan kembali kelas Binding Data.
— Yamashiro Rion

9

Masalah ini sebagian besar terjadi karena kesalahan dalam setText()metode

Solusi adalah sederhana, berikan Integernilai Anda dengan mengonversi ke dalam stringtipe

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

1

Kadang ini terjadi karena tidak menyukai sumber apa pun seperti jika saya ingin mengatur teks menjadi textview dari adaptor maka saya harus menggunakan

 textView.setText(""+name);

Jika Anda menulis sesuatu seperti

 textView.setText(name);

ini tidak akan berfungsi dan kadang-kadang kita tidak menemukan sumber daya dari file string.xml maka jenis kesalahan ini terjadi.


0

Menggunakan DataBinding dan pengaturan latar belakang ke edittext dengan sumber daya dari folder drawable menyebabkan pengecualian.

<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"/>

Larutan

Saya hanya mengubah latar belakang dari android:background="@drawable/rectangle"menjadi android:background="@null"

Bersihkan dan Bangun Kembali Proyek.


-1

Anda menetapkan nilai numerik ke bidang teks. Anda harus mengonversi nilai numerik menjadi string dengan:

String.valueOf(variable)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.