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

158

Я получаю исключение из заголовка при запуске приложения. Он имеет файл .txt со словами для игры Hangman, и я думаю, что исключение выдается при доступе к файлу. Мой файл cuvinte.txt находится в / assets /. Вот мой код (я пропустил часть layout / 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 ().

FloIancu
источник
Вы должны закрыть этих читателей после того, как вы закончите с ними
Губатрон
1
Ради профессионализма, пожалуйста, назовите свои переменные на английском языке :)
Matei Suica
1
В моем случае это произошло потому, что я пытался передать параметр int внутри setText()функции.
Таслим Осени

Ответы:

548

(Только предположение, меньше информации о трассировке стека исключений)

Я думаю, эта строка, incercari.setText(valIncercari);исключает, потому что valIncercariестьint

Так и должно быть,

incercari.setText(valIncercari+"");

Или

incercari.setText(Integer.toString(valIncercari));
user370305
источник
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 все ID ресурса имеет intзначение.
user370305
1
String.format - рекомендуемый способ. setText (String.format (Locale.US, "% d", valIncercari));
Джеффри
15

Я просто хотел указать на другую причину, по которой эта ошибка может быть вызвана тем, что вы определили строковый ресурс для одного перевода вашего приложения, но не предоставили строковый ресурс по умолчанию.

Пример выпуска:

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

Значения-е / 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>

Значения-о / strings.xml

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

Значения-е / strings.xml

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

Значения-де / strings.xml

<string name="get_started">Ioslegen</string>
Дэвид Аргайл Такер
источник
Это произошло, когда я скопировал ресурсы из одного проекта Android Studio в другой и скопировал файл strings.xml. Из-за некоторого кеширования / перезагрузки / чего бы то ни было, он удалял новый файл и сохранял старый. Таким образом, у меня были строковые идентификаторы из перевода, но не из простого string.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));
Suyog
источник
1

Иногда это происходило из-за того, что я не нашел источник, например, если я хочу установить текст в текстовое представление из адаптера, тогда я должен использовать

 textView.setText(""+name);

Если вы напишите что-то вроде

 textView.setText(name);

это не будет работать, и иногда мы не находим ресурс из файла string.xml, тогда возникает этот тип ошибки.

павел
источник
0

Исключением является использование DataBinding и установка фона для текста редактирования с ресурсами из папки drawable.

<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)
gdois
источник