Android: android.content.res.Resources $ NotFoundException: Dize kaynak kimliği # 0x5


158

Uygulamamı çalıştırdığımda başlıktan istisna alıyorum. Ne yaptığı bir Adam Asmaca oyun için kelimelerle bir .txt dosyası var ve ben dosyaya erişirken istisna atılmış olduğunu düşünüyorum. Dosyam, cuvinte.txt, / asset / konumunda bulunuyor. İşte benim kod (i iyi çalışır düzeni / xml bölümü atlandı):

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 () işlevi, hem yeni oyun düğmesine basıldığında hem de etkinliğin başında, onCreate () işlevinde çağrılır.


bitirdikten sonra bu okuyucuları kapatmalısınız
Gubatron

1
Profesyonellik uğruna, değişkenlerinizi İngilizce olarak adlandırın :)
Matei Suica

1
Benim durumumda bunu yaşadım çünkü bir setText()fonksiyonun içindeki int parametresini geçirmeye çalışıyordum .
Taslim Oseni

Yanıtlar:


548

(Sadece varsayım, Özel Durum yığın izinin daha az bilgisi)

Ben, bu çizgi, düşünmek incercari.setText(valIncercari);çünkü İstisna atar valIncercariolduğunuint

Bu yüzden olmalı,

incercari.setText(valIncercari+"");

Veya

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

15
ya da daha iyisi:Integer.toString(valIncercari);
Jave

6
String.valueOf () ile aynı; Integer.toString ve diğer ilgili yöntemleri çağırır
Jan Rabe

4
Android Studio'nun neden size tavsiyede bulunmadığını merak ediyorum. Hata için TextView.setText içine int değeri ayarlamada aynı sorun vardı.
bheatcoker

2
@bheatcoker - setText(int)dize kaynağını kimliğe göre almak için de kullanılır. Ve Android'de tüm kaynak kimliğinin intdeğeri vardır.
user370305

1
String.format önerilen yoldur. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

Uygulamanızın bir çevirisi için bir dize kaynağı tanımlamış ancak varsayılan bir dize kaynağı sağlamadıysanız, bu hatanın atılabilmesinin başka bir nedenini belirtmek istedim.

Sorun Örneği:

Aşağıda görebileceğiniz gibi, "get_started" için İspanyolca bir dize kaynağı vardı. Yine de kodda referans verilebilir, ancak telefon İspanyolca değilse, arama yaparken yüklenecek ve çökecek bir kaynağı olmayacaktır getString().

değerler-es / strings.xml

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

Kaynağa referans

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)

Sorunun Çözümü

values/strings.xmlBunu önlemek oldukça basittir, telefonun başka bir dilde olması durumunda her zaman geri dönecek bir kaynağa sahip olması için her zaman varsayılan bir dize kaynağına sahip olduğunuzdan emin olun .

değerler / strings.xml

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

değerler-tr / strings.xml

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

değerler-es / strings.xml

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

değerler-de / strings.xml

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

Bu, bir Android Studio projesinden kaynakları diğerine kopyaladığımda vuruldu ve strings.xml dosyasını kopyaladım. Bazı önbellekleme / yeniden yükleme / ne olursa olsun, yeni dosyayı atıp eskisini tuttu. Yani çeviri dize ids vardı ama düz string.xml
denispyr

14

Bu özel duruma neden olabilecek başka bir senaryo, DataBinding ile, yani mizanpajınızda böyle bir şey kullandığınızda

<?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>

Kullandığım değişkenin bir Tamsayı olduğuna ve TextView metin alanına atadığına dikkat edin. TextView zaten imzalı bir yöntem setText(int)içerdiğinden, değeri kullanmak yerine bu yöntemi kullanır setText(String). Böylece TextView, giriş numaranızı açıkça geçerli olmayan bir kaynak değeri olarak düşünür.

Çözüm int değerinizi böyle dizeye dökmektir

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

Teşekkürler, yardımcı oldu. Ayrıca bundan sonra Veri Bağlama sınıflarını yeniden oluşturmak için Android Studio'da Build-> gerekir Clean Project.
Yamashiro Rion

9

Bu sorun çoğunlukla setText()yöntemdeki hata nedeniyle oluşur

Çözümü basit olarak Integerdeğeri stringtürüne dönüştürerek koymak

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

1

Bazen bu bağdaştırıcıdan bir textview içine bir metin ayarlamak istiyorsanız gibi herhangi bir kaynak düşkün değil nedeniyle oldu sonra kullanmalıyım

 textView.setText(""+name);

Eğer şöyle bir şey yazarsan

 textView.setText(name);

Bu işe yaramaz ve bazen string.xml dosyasındaki kaynağı bulamazsak bu tür bir hata oluşur.


0

DataBinding kullanmak ve arka planını edittext için çekilebilir klasördeki kaynaklarla ayarlamak istisnayı oluşturur.

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

Çözüm

Arka planı sadece android:background="@drawable/rectangle"yerine android:background="@null"

Projeyi temizleyin ve yeniden oluşturun.


-1

Bir metin alanına sayısal bir değer ataıyorsunuz. Sayısal değeri şu dizeye dönüştürmeniz gerekir:

String.valueOf(variable)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.