web-dev-qa-db-ja.com

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

アプリを実行すると、タイトルから例外が発生します。ハングマンゲームの単語を含む.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()関数で呼び出されます。

126
FloIancu

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

valIncercariintであるため、この行、incercari.setText(valIncercari);は例外をスローすると思います

だから、あるべき

incercari.setText(valIncercari+"");

または

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

このエラーがスローされる可能性がある別の理由を指摘したかったのは、アプリの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>
11

この例外を引き起こす可能性がある別のシナリオは、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)}"
9
Kayvan N

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

解決策は、次のようにInteger型に変換してstring値を置くだけです

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

DataBindingを使用し、drawableフォルダーのリソースを使用して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"に変更するだけです

プロジェクトをクリーンおよびリビルドします。

0
A.N.T

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

 textView.setText(""+name);

あなたが何かを書くなら

 textView.setText(name);

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

0
pavel