Android : android.content.res.Resources $ NotFoundException : 문자열 리소스 ID # 0x5 BufferedReader

앱을 실행할 때 제목에서 예외가 발생합니다. 행맨 게임용 단어가 포함 된 .txt 파일이 있으며 파일에 액세스 할 때 예외가 발생한다고 생각합니다. 내 파일 cuvinte.txt는 / assets /에 있습니다. 내 코드는 다음과 같습니다 (레이아웃 / 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 () 함수에서 새 게임 버튼을 누르고 활동 시작시 호출됩니다.



답변

(단지 가정, 예외 스택 추적 정보가 적음)

나는,이 라인은, 생각 incercari.setText(valIncercari);하기 때문에 예외를 throw valIncercari이다int

그러니까

incercari.setText(valIncercari+"");

또는

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


답변

이 오류가 발생할 수있는 또 다른 이유를 지적하고 싶을 때 앱의 한 번역에 문자열 리소스를 정의했지만 기본 문자열 리소스를 제공하지 않았기 때문입니다.

문제의 예 :

아래에서 볼 수 있듯이 스페인어 문자열 “get_started”에 대한 문자열 리소스가 있습니다. 코드에서 여전히 참조 할 수 있지만 전화가 스페인어가 아닌 경우를 호출 할 때로드 및 충돌 할 리소스가 없습니다 getString().

values-es / strings.xml

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

자원에 대한 참조

textView.setText(getString(R.string.get_started)

로그 캣 :

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


답변

이 예외를 발생시킬 수있는 또 다른 시나리오는 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)}"


답변

이 문제는 대부분 setText()방법 의 오류로 인해 발생합니다.

해결책은 다음 과 같이 유형으로 Integer변환 하여 가치를 간단하게 넣는 것입니다.string

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


답변

언젠가 이것은 어댑터에서 텍스트보기로 텍스트를 설정하려는 경우와 같은 소스를 좋아하지 않기 때문에 발생했습니다.

 textView.setText(""+name);

당신이 같은 것을 쓰면

 textView.setText(name);

이것은 작동하지 않으며 때로는 string.xml 파일에서 리소스를 찾지 못하면 이러한 유형의 오류가 발생합니다.


답변

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"

프로젝트를 정리하고 다시 빌드하십시오.


답변

텍스트 필드에 숫자 값을 할당하고 있습니다. 다음을 사용하여 숫자 값을 문자열로 변환해야합니다.

String.valueOf(variable)