Android: android.content.res.Resources $ NotFoundException: ID ทรัพยากรสตริง # 0x5


158

ฉันได้รับการยกเว้นจากชื่อเมื่อเรียกใช้แอพของฉัน มันคืออะไรมันมีไฟล์. txt พร้อมคำสำหรับเกม Hangman และฉันคิดว่ามีข้อผิดพลาดเกิดขึ้นเมื่อเข้าถึงไฟล์ ไฟล์ของฉัน 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
ในกรณีของฉันฉันพบสิ่งนี้เพราะฉันพยายามส่งพารามิเตอร์ int ภายในsetText()ฟังก์ชั่น
Taslim Oseni

คำตอบ:


548

(เพียงข้อสันนิษฐานข้อมูลน้อยลงของข้อยกเว้นสแตร็กเทรซ)

ฉันคิดว่าบรรทัดนี้incercari.setText(valIncercari);พ่นข้อยกเว้นเพราะvalIncercariเป็นint

ดังนั้นควรจะเป็น

incercari.setText(valIncercari+"");

หรือ

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

15
หรือดียิ่งขึ้น:Integer.toString(valIncercari);
Jave

6
เหมือนกับ String.valueOf (); ซึ่งไม่เรียก Integer.toString และวิธีการ toString อื่น ๆ ที่เกี่ยวข้อง
ม.ค. Rabe

4
ฉันสงสัยว่าทำไม Android Studio ถึงไม่แนะนำคุณ ฉันมีปัญหาเดียวกันการตั้งค่า int เป็น TextView.setText สำหรับข้อผิดพลาด
bheatcoker

2
@bheatcoker - เพราะsetText(int)ยังใช้เพื่อรับทรัพยากรสตริงโดย id และใน Android id ทรัพยากรทั้งหมดมีintค่า
user370305

1
String.format เป็นวิธีที่แนะนำ setText (String.format (Locale.US, "% d", valIncercari));
เจฟฟรีย์

15

ก็แค่อยากจะชี้ให้เห็นเหตุผลอื่นข้อผิดพลาดนี้สามารถโยนได้คือถ้าคุณกำหนดทรัพยากรสตริงสำหรับการแปลหนึ่งของแอปของคุณ แต่ไม่ได้ให้ทรัพยากรสตริงเริ่มต้น

ตัวอย่างของปัญหา:

อย่างที่คุณเห็นด้านล่างฉันมีทรัพยากรสตริงสำหรับสตริงภาษาสเปน "get_started" ก็ยังสามารถอ้างอิงในรหัส getString()แต่ถ้าโทรศัพท์ไม่ได้อยู่ในสเปนก็จะมีทรัพยากรภาระและความผิดพลาดเมื่อเรียก

ค่า-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เพื่อที่ว่าหากโทรศัพท์เป็นภาษาอื่นจะมีทรัพยากรที่จะย้อนกลับไปใช้เสมอ

ค่า / strings.xml

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

ค่า-en / strings.xml

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

ค่า-ES / strings.xml

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

ค่า-de / strings.xml

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

สิ่งนี้ฮิตเมื่อฉันคัดลอกทรัพยากรจากโครงการ Android Studio หนึ่งไปยังอีกโครงการหนึ่งและฉันคัดลอกไฟล์ strings.xml เนื่องจากมีการแคช / โหลดซ้ำ / สิ่งที่มันทิ้งไฟล์ใหม่และเก็บเก่า ดังนั้นฉันมีรหัสสตริงจากการแปล แต่ไม่ใช่จาก string.xml ธรรมดา
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)}"

ขอบคุณมันช่วยได้ หลังจากนั้นคุณต้องBuild-> Clean Projectใน Android Studio เพื่อสร้างคลาส Binding Data อีกครั้ง
Yamashiro Rion

9

ปัญหานี้ส่วนใหญ่เกิดขึ้นเนื่องจากข้อผิดพลาดในsetText()วิธีการ

วิธีการแก้ปัญหาง่าย ๆ ให้Integerคุณค่าของคุณโดยแปลงเป็นstringประเภท

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

1

บางครั้งสิ่งนี้เกิดขึ้นเนื่องจากไม่ชอบแหล่งข้อมูลใด ๆ เช่นถ้าฉันต้องการตั้งค่าข้อความเป็นมุมมองข้อความจากอะแดปเตอร์แล้วฉันควรใช้

 textView.setText(""+name);

ถ้าคุณเขียนอะไรเช่น

 textView.setText(name);

สิ่งนี้จะไม่ทำงานและบางครั้งเราไม่พบทรัพยากรจากไฟล์ string.xml ดังนั้นข้อผิดพลาดประเภทนี้จะเกิดขึ้น


0

การใช้ DataBinding และการตั้งค่าพื้นหลังเป็น edittext พร้อมทรัพยากรจากโฟลเดอร์ 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.