Android: android.content.res.Resources $ NotFoundException: Identyfikator zasobu ciągu # 0x5


158

Po uruchomieniu aplikacji pojawia się wyjątek od tytułu. To, co robi, to plik .txt ze słowami dla gry w Wisielca i myślę, że wyjątek jest zgłaszany podczas uzyskiwania dostępu do pliku. Mój plik cuvinte.txt znajduje się w / asset /. Oto mój kod (pominąłem część układu / xml, która działa dobrze):

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

Funkcja newGame () jest wywoływana zarówno po naciśnięciu przycisku nowej gry, jak i na początku działania, w funkcji onCreate ().


powinieneś zamknąć tych czytelników, kiedy z nimi
skończysz

1
Ze względu na profesjonalizm, nazwij swoje zmienne po angielsku :)
Matei Suica

1
W moim przypadku doświadczyłem tego, ponieważ próbowałem przekazać parametr int wewnątrz setText()funkcji.
Taslim Oseni

Odpowiedzi:


548

(Tylko założenie, mniej informacji o śledzeniu stosu wyjątków)

Myślę, że ta linia incercari.setText(valIncercari);rzuca Wyjątek, ponieważvalIncercari jestint

Tak powinno być

incercari.setText(valIncercari+"");

Lub

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

15
lub nawet lepiej:Integer.toString(valIncercari);
Jave

6
to samo co String.valueOf (); która wywołuje Integer.toString i inne odpowiednie metody toString
Jan Rabe

4
Zastanawiam się, dlaczego Android Studio Ci nie radzi. Miałem ten sam problem z ustawieniem wartości int w TextView.setText z powodu błędu.
bheatcoker

2
@bheatcoker - ponieważ setText(int)służy również do pobierania zasobu ciągu według identyfikatora. W systemie Android wszystkie identyfikatory zasobów mają intwartość.
user370305

1
String.format jest zalecanym sposobem. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

Chciałem tylko wskazać inny powód, dla którego ten błąd może zostać zgłoszony, jeśli zdefiniowałeś zasób ciągu dla jednego tłumaczenia swojej aplikacji, ale nie podałeś domyślnego zasobu ciągu.

Przykład problemu:

Jak widać poniżej, miałem zasób ciągu dla hiszpańskiego ciągu znaków „get_started”. Nadal można się do niego odwoływać w kodzie, ale jeśli telefon nie jest w języku hiszpańskim, nie będzie miał zasobów do załadowania i awarii podczas dzwonienia getString().

wartości-es / strings.xml

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

Odniesienie do zasobu

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)

Rozwiązanie problemu

Zapobieganie temu jest dość proste, po prostu upewnij się, że zawsze masz domyślny zasób ciągu values/strings.xml, aby jeśli telefon był w innym języku, zawsze miał zasób, do którego można wrócić.

wartości / strings.xml

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

wartości-en / strings.xml

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

wartości-es / strings.xml

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

wartości-de / strings.xml

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

Ten jeden trafił, gdy skopiowałem zasoby z jednego projektu Android Studio do innego i skopiowałem plik strings.xml. Z powodu buforowania / przeładowywania / czegokolwiek, odrzucił nowy plik i zachował stary. Więc miałem identyfikatory ciągów z tłumaczenia, ale nie ze zwykłego ciągu.xml
denispyr

14

Innym scenariuszem, który może spowodować ten wyjątek, jest wiązanie danych, czyli użycie czegoś takiego w układzie

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

Zauważ, że zmienna, której używam, jest liczbą całkowitą i przypisuję ją do pola tekstowego TextView. Ponieważ TextView ma już metodę z podpisem setText(int), użyje tej metody zamiast używania setText(String)i rzutowania wartości. Dlatego TextView traktuje numer wejściowy jako wartość zasobu, która oczywiście nie jest poprawna.

Rozwiązaniem jest rzutowanie wartości int na łańcuch w ten sposób

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

Dzięki, pomogło. Następnie musisz Build-> Clean Projectw Android Studio ponownie wygenerować klasy powiązań danych.
Yamashiro Rion

9

Ten problem występuje głównie z powodu błędu w setText()metodzie

Rozwiązanie jest proste, wpisz swoją Integerwartość, konwertując na stringtyp as

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

1

Czasami zdarzyło się to, ponieważ nie lubiłem żadnego źródła, jak jeśli chcę ustawić tekst w widoku tekstu z adaptera, powinienem użyć

 textView.setText(""+name);

Jeśli napiszesz coś w stylu

 textView.setText(name);

to nie zadziała i czasami nie znajdziemy zasobu z pliku string.xml, wtedy wystąpi tego typu błąd.


0

Użycie DataBinding i ustawienie tła dla edittext z zasobami z folderu do rysowania powoduje wyjątek.

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

Rozwiązanie

Po prostu zmieniam tło z android:background="@drawable/rectangle"na android:background="@null"

Wyczyść i odbuduj projekt.


-1

Przypisujesz wartość liczbową do pola tekstowego. Musisz przekonwertować wartość liczbową na ciąg z:

String.valueOf(variable)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.