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.