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


158

앱을 실행할 때 제목에서 예외가 발생합니다. 행맨 게임용 단어가 포함 된 .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 () 함수에서 새 게임 버튼을 누르고 활동 시작시 호출됩니다.


당신은 그들과 함께 한 후 그 독자를 닫아야합니다
Gubatron

1
전문성을 위해 영어로 변수 이름을 지정하십시오 :)
Matei Suica

1
필자의 경우 setText()함수 내부에 int 매개 변수를 전달하려고했기 때문에이 문제가 발생했습니다 .
Taslim Oseni 16:30에 16:30

답변:


548

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

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

그러니까

incercari.setText(valIncercari+"");

또는

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

15
또는 더 나은 :Integer.toString(valIncercari);
Jave

6
String.valueOf ()와 동일; Integer.toString 및 기타 각각의 toString 메소드를 호출합니다
Jan Rabe

4
Android Studio가 왜 조언하지 않는지 궁금합니다. 오류에 대해 int 값을 TextView.setText에 설정하는 것과 동일한 문제가 발생했습니다.
bheatcoker

2
@bheatcoker- setText(int)id로 문자열 리소스를 얻는 데 사용 되기 때문 입니다. 그리고 안드로이드에서 모든 리소스 ID는 int가치가 있습니다.
user370305

1
String.format이 권장되는 방법입니다. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

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

문제의 예 :

아래에서 볼 수 있듯이 스페인어 문자열 "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>

하나의 Android Studio 프로젝트에서 다른 프로젝트로 리소스를 복사하고 strings.xml 파일을 복사했을 때 발생했습니다. 일부 캐싱 / 재로드 / 다른 파일로 인해 새 파일을 버리고 이전 파일을 유지했습니다. 그래서 번역에서 문자열 ID를 얻었지만 일반 string.xml에서는 문자열 ID를 얻지 못했습니다.
denispyr

14

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

고마워요. 또한 데이터 바인딩 클래스를 다시 생성하려면 Android Studio에서 Build-> 해야합니다 Clean Project.
야마시로 리온

9

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

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

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

1

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

 textView.setText(""+name);

당신이 같은 것을 쓰면

 textView.setText(name);

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


0

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"

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


-1

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

String.valueOf(variable)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.