programing

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

oldcodes 2023. 8. 12. 10:39
반응형

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

앱을 실행할 때 제목에서 예외가 발생합니다.그것이 하는 일은 행맨 게임을 위한 단어들이 있는 .txt 파일을 가지고 있고 나는 그 파일에 접근할 때 예외가 던져진다고 생각합니다.내 파일이야, 큐벳txt는 /txt/에 있습니다.다음은 제 코드입니다(레이아웃/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);다음 이유로 예외 발생valIncercari이라int

그래서 그래야 합니다.

incercari.setText(valIncercari+"");

또는

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

이 예외를 발생시킬 수 있는 또 다른 시나리오는 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에는 이미 다음과 같은 서명을 가진 메서드가 있기 때문입니다.setText(int)사용하는 대신 이 방법을 사용할 것입니다.setText(String)가치를 제시합니다.따라서 TextView는 사용자의 입력 번호를 리소스 값으로 간주하며 이 값은 분명히 유효하지 않습니다.

해결책은 다음과 같이 문자열에 int 값을 캐스트하는 것입니다.

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

이 오류가 발생할 수 있는 또 다른 이유는 앱의 한 변환에 대해 문자열 리소스를 정의했지만 기본 문자열 리소스를 제공하지 않은 경우입니다.

문제의 예:

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

values-es/values.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/values.xml

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

values-en/values.xml

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

values-es/values.xml

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

values-de/values.xml

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

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

솔루션은 단순합니다.Integer로 변환하여 가치를 부여합니다.string로 입력합니다.

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

때때로 이것은 어댑터에서 텍스트 보기로 텍스트를 설정하고 사용하는 것과 같은 소스를 선호하지 않기 때문에 발생했습니다.

 textView.setText(""+name);

만약 당신이 다음과 같은 것을 쓴다면.

 textView.setText(name);

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

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

String.valueOf(variable)

때때로 우리는 dimension이나 다른 resources 폴더에 리소스를 추가할 때 dp를 추가하는 것을 잊습니다.

<dimen name="exercise_value">4</dimen>

예를 들어, 저는 제 가치에 dp를 추가하는 것을 잊었기 때문에 이 문제에 직면했습니다.
그다음에 제가 바꿔봤습니다.

<dimen name="exercise_value">4dp</dimen> <br>

쾅. 오류가 사라졌습니다.

사용 및 을 "" "" " " " " " "로 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"

프로젝트를 정리하고 다시 작성합니다.

이 문제를 해결하려면 다음을 교체해야 했습니다.

Toast.makeText(this, my_int_var, Toast.LENGTH_SHORT).show();

이것으로:

Toast.makeText(this, String.valueOf(my_int_var), Toast.LENGTH_SHORT).show();

언급URL : https://stackoverflow.com/questions/11189545/android-android-content-res-resourcesnotfoundexception-string-resource-id-0x

반응형