Android: android.content.res.Resources $ NotFoundException: ID do recurso de sequência # 0x5


158

Recebo a exceção do título quando executo meu aplicativo. O que ele faz é ter um arquivo .txt com palavras para um jogo da forca e acho que a exceção é lançada ao acessar o arquivo. Meu arquivo, cuvinte.txt, está localizado em / assets /. Aqui está o meu código (eu pulei a parte do layout / xml, que funciona bem):

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

A função newGame () é chamada quando o novo botão do jogo é pressionado e no início da atividade, na função onCreate ().


você deve fechar os leitores depois que você fez com eles
todo WGA

1
Por uma questão de profissionalismo, por favor nomear suas variáveis em Inglês :)
Matei Suica

1
No meu caso, experimentei isso porque estava tentando passar um parâmetro int dentro de uma setText()função.
Taslim Oseni 30/08/19

Respostas:


548

(Apenas suposição, menos informações do rastreamento de pilha de exceção)

Eu acho que essa linha incercari.setText(valIncercari);lança Exception porque valIncercariéint

Então deveria ser,

incercari.setText(valIncercari+"");

Ou

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

15
ou melhor:Integer.toString(valIncercari);
Jave

6
mesmo que String.valueOf (); que põe Integer.toString e outros respectivos métodos toString
Jan Rabe

4
Gostaria de saber por que o Android Studio não aconselha você. Eu tive o mesmo problema ao definir um valor int em TextView.setText por erro.
Bheatcoker

2
@bheatcoker - porque setText(int)também é usado para obter recursos de string por ID. E no Android, todos os IDs de recursos têm intvalor.
user370305

1
String.format é a maneira recomendada. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

Só queria apontar outro motivo para o erro: se você definiu um recurso de sequência para uma tradução do seu aplicativo, mas não forneceu um recurso de sequência padrão.

Exemplo do problema:

Como você pode ver abaixo, eu tinha um recurso de string para uma string espanhola "get_started". Ele ainda pode ser referenciado no código, mas se o telefone não estiver em espanhol, ele não terá recursos para carregar e travar ao ligar getString().

values-es / strings.xml

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

Referência ao recurso

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)

Solução para o problema

Evitar isso é bastante simples, verifique se você sempre tem um recurso de string padrão values/strings.xmlpara que, se o telefone estiver em outro idioma, ele sempre tenha um recurso para o qual retornar.

values ​​/ strings.xml

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

values-pt / 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>

Este ocorreu quando copiei recursos de um projeto do Android Studio para outro e copiei o arquivo strings.xml. Devido a algum armazenamento em cache / recarregamento / o que quer que seja, ele descartou o novo arquivo e manteve o antigo. Então eu tive os IDs de string da tradução, mas não a partir do string.xml simples
denispyr

14

Outro cenário que pode causar essa exceção é o DataBinding, ou seja, quando você usa algo assim no seu layout

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

Observe que a variável que estou usando é um número inteiro e a estou atribuindo ao campo de texto do TextView. Como o TextView já possui um método com assinatura, setText(int)ele usará esse método em vez de usar o setText(String)e converter o valor. Assim, o TextView considera seu número de entrada como um valor de recurso que obviamente não é válido.

A solução é converter seu valor int para uma string como esta

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

Obrigado, ajudou. Depois disso, você precisa Build-> Clean Projectno Android Studio para gerar novamente as classes de Ligação de dados.
Yamashiro Rion

9

Esse problema ocorre principalmente devido ao erro no setText()método

A solução é simples, coloque seu Integervalor convertendo-o em stringtipo

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

1

Às vezes isso aconteceu devido a não gostar de nenhuma fonte, como se eu quiser definir um texto em um textview do adaptador, então devo usar

 textView.setText(""+name);

Se você escrever algo como

 textView.setText(name);

isso não funcionará e, em algum momento, não encontrarmos o recurso no arquivo string.xml, ocorrerá esse tipo de erro.


0

Usar DataBinding e definir plano de fundo para o edittext com recursos da pasta drawable causa a exceção.

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

Solução

Eu apenas mudo o fundo de android:background="@drawable/rectangle"para android:background="@null"

Limpe e reconstrua o projeto.


-1

Você está atribuindo um valor numérico a um campo de texto. Você precisa converter o valor numérico em uma string com:

String.valueOf(variable)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.