Android:android.content.res.Resources $ NotFoundException:文字列リソースID#0x5


158

アプリを実行すると、タイトルから例外が発生します。それが何をしているのかというと、絞首刑執行人のゲーム用の単語を含む.txtファイルがあり、ファイルにアクセスすると例外がスローされると思います。私のファイル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()関数の両方で呼び出されます。


読み終わったら、これらのリーダーを閉じる必要があります
Gubatron 2013

1
プロ意識のために、変数には英語で名前を付けてください:)
Matei Suica

1
私の場合は、setText()関数内でintパラメータを渡そうとしたため、これを経験しました。
Taslim Oseni

回答:


548

(単なる仮定、例外スタックトレースの情報が少ない)

私は、この行が、だと思うincercari.setText(valIncercari);ので、例外をスローしvalIncercariていますint

ですから、

incercari.setText(valIncercari+"");

または

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

15
またはさらに良い:Integer.toString(valIncercari);
ジェイブ

6
String.valueOf();と同じ Integer.toStringおよびその他のそれぞれのtoStringメソッドを呼び出します
Jan Rabe

4
なぜAndroid Studioはあなたに助言しないのでしょうか。エラーのためにTextView.setTextにint値を設定するのと同じ問題がありました。
bheatcoker 2016

2
@bheatcoker- setText(int)IDで文字列リソースを取得するためにも使用されるため。Androidでは、すべてのリソースIDにint値があります。
user370305

1
String.formatが推奨される方法です。setText(String.format(Locale.US、 "%d"、valIncercari));
ジェフリー

15

このエラーがスローされる別の理由を指摘したいのは、アプリの1つの翻訳に対して文字列リソースを定義したが、デフォルトの文字列リソースを提供しなかった場合です。

問題の例:

以下に示すように、スペイン語の文字列「get_started」の文字列リソースがありました。コードで参照することはできますが、電話がスペイン語でない場合、を呼び出すときにロードしてクラッシュするリソースがありませんgetString()

values-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です。電話が別の言語である場合に常にフォールバックするリソースがあるように、常にデフォルトの文字列リソースがあることを確認してください。

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>

これは、あるAndroid Studioプロジェクトから別のプロジェクトにリソースをコピーし、strings.xmlファイルをコピーしたときに発生しました。キャッシング/リロード/何らかの理由で、新しいファイルは破棄され、古いファイルが保持されました。そのため、翻訳からの文字列IDはありましたが、プレーンなstring.xmlからはありませんでした
denispyr

14

この例外を引き起こす可能性があるもう1つのシナリオは、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>

私が使用している変数はIntegerであり、TextViewのテキストフィールドに割り当てていることに注意してください。TextViewにはすでにシグネチャを持つメソッドがあるため、setText(int)を使用しsetText(String)て値をキャストする代わりに、このメソッドを使用します。したがって、TextViewは入力値を明らかに無効なリソース値と見なします。

解決策は、次のようにint値を文字列にキャストすることです

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

おかげで、役に立ちました。また、その後、Android StudioでBuild-> Clean Projectデータバインディングクラスを再生成する必要があります。
山城リオン

9

この問題は主にsetText()メソッドのエラーが原因で発生します

解決策は単純Integerstringタイプに変換することであなたの価値を置くことです

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

1

アダプタからテキストビューにテキストを設定したい場合など、ソースが好きではないためにこれが発生したことがあります

 textView.setText(""+name);

次のようなものを書いた場合

 textView.setText(name);

これは機能せず、string.xmlファイルからリソースが見つからない場合は、このタイプのエラーが発生します。


0

DataBindingを使用し、ドローアブルフォルダーからのリソースを含むedittextに背景を設定すると、例外が発生します。

<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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.