Android: android.content.res.Resources $ NotFoundException: Ідентифікатор рядкового ресурсу # 0x5


158

Я отримую виняток із назви, коли запускаю додаток. Що він робить - це файл у форматі .txt зі словами для гри в Hangman, і я думаю, що виняток кидається під час доступу до файлу. Мій файл, cuvinte.txt розташований у / imovins /. Ось мій код (я пропустив макет / xml частину, яка добре працює):

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

Функція newGame () викликається як при натисканні нової кнопки гри, так і на початку активності, у функції onCreate ().


ви повинні закрити цих читачів після того, як ви закінчите з ними
Губатрон

1
Заради професіоналізму, будь ласка, назвіть свої змінні англійською мовою :)
Matei Suica

1
У моєму випадку я зазнав цього, тому що я намагався передати параметр int всередині setText()функції.
Таслім Осені

Відповіді:


548

(Просто припущення, менша інформація про стекстацію винятків)

Я думаю, цей рядок incercari.setText(valIncercari);кидає виняток, оскільки valIncercariєint

Так і має бути,

incercari.setText(valIncercari+"");

Або

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

15
а ще краще:Integer.toString(valIncercari);
Jave

6
те саме, що String.valueOf (); який закликає Integer.toString та інші відповідні методи toString
Jan Rabe

4
Мені цікаво, чому Android Studio вам не радить. У мене була така ж проблема із встановленням значення int у TextView.setText для помилки.
bheatcoker

2
@bheatcoker - тому що setText(int)також використовується для отримання рядкового ресурсу за id. І в Android весь ідентифікатор ресурсу має intзначення.
user370305

1
String.format - рекомендований спосіб. setText (String.format (Locale.US, "% d", valIncercari));
Джефрі

15

Просто хотілося вказати на іншу причину, яку цю помилку можна видалити, якщо ви визначили рядовий ресурс для одного перекладу вашої програми, але не надали строковий ресурс за замовчуванням.

Приклад випуску:

Як ви бачите нижче, у мене був рядовий ресурс для іспанського рядка "get_started". На нього все ще можна посилатися в коді, але якщо телефон не іспанською мовою, у нього не буде ресурсу для завантаження та збоїв під час дзвінка getString().

значення-es / strings.xml

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

Посилання на ресурс

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)

Рішення питання

Попередити це досить просто, просто переконайтеся, що у вас завжди є джерело рядка за замовчуванням, values/strings.xmlтак що якщо телефон іншою мовою, він завжди матиме ресурс, на який потрібно повернутися.

значення / strings.xml

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

values-en / strings.xml

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

значення-es / strings.xml

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

значень-de / strings.xml

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

Цей хіт, коли я копіював ресурси з одного проекту Android Studio в інший, і я скопіював файл strings.xml. Через деяке кешування / перезавантаження / все, що він відкинув новий файл і зберег старий. Тож у мене були рядкові ідентифікатори з перекладу, але не з простого рядка.xml
denispyr

14

Інший сценарій, який може спричинити цей виняток, - це DataBinding, тобто коли ви використовуєте щось подібне у своєму макеті

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

Зауважте, що змінна, яку я використовую, є цілим числом, і я призначаю її до текстового поля TextView. Оскільки у TextView вже є метод з підписом, setText(int)він буде використовувати цей метод замість використання setText(String)та передавати значення. Таким чином, TextView вважає ваш номер введення як значення ресурсу, що, очевидно, є невірним.

Рішення полягає в тому, щоб передати ваше значення int на такий рядок

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

Дякую, це допомогло. Також після цього вам потрібно Build-> Clean Projectв Android Studio відтворити класи прив'язки даних.
Ріон

9

Ця проблема здебільшого виникає через помилку в setText()методі

Рішення просте, поставивши свою Integerвартість, перетворивши в stringтип як

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

1

Колись це сталося через те, що я не захоплююсь жодним джерелом, наприклад, якщо я хочу встановити текст у перегляд тексту через адаптер, то я повинен використовувати

 textView.setText(""+name);

Якщо ви пишете щось на кшталт

 textView.setText(name);

це не буде працювати, і колись ми не знаходимо ресурс з файлу string.xml, тоді виникає такий тип помилок.


0

Використання DataBinding та встановлення фону для редакції з ресурсами з папки, що виводиться, викликає виняток.

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

Рішення

Я просто змінюю фон з android:background="@drawable/rectangle"на android:background="@null"

Очистити та відновити проект.


-1

Ви присвоюєте числове значення текстовому полі. Ви повинні перетворити числове значення в рядок за допомогою:

String.valueOf(variable)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.