Android:android.content.res.Resources $ NotFoundException:string资源ID#0x5
当我运行我的应用程序时,我从标题中得到exception。 它所做的就是为一个Hangman游戏提供一个带有单词的.txt文件,我认为访问这个文件时会抛出exception。 我的文件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()在新游戏button被按下时以及在onCreate()函数的活动开始时被调用。
(只是假设,更less的信息exceptionstacktrace)
我想,这行, incercari.setText(valIncercari);
抛出exception,因为valIncercari
是int
所以应该是,
incercari.setText(valIncercari+"");
要么
incercari.setText(Integer.toString(valIncercari));
只是想指出另一个可能抛出此错误的原因是如果您为应用程序的一个翻译定义了一个string资源,但没有提供默认的string资源。
问题的例子:
正如你在下面看到的,我有一个西class牙string“get_started”的string资源。 它仍然可以在代码中引用,但是如果手机不是西class牙语,那么在调用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)
问题的解决scheme
防止这种情况非常简单,只要确保在values/strings.xml
总是有一个默认的string资源,这样如果手机是另一种语言,它总是有一个资源可以回退。
值/ strings.xml中
<string name="get_started">Get Started</string>
值恩/ 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>
可能导致此exception的另一种情况是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>
请注意,我使用的variables是一个Integer,我将它分配给TextView的文本字段。 由于TextView已经有一个setText(int)
签名的方法,所以它将使用这个方法而不是使用setText(String)
并转换值。 因此,TextView会将您的input号码视为显然无效的资源值。
解决的办法是把你的int值转换成像这样的string
android:text="@{String.valueOf(model.someIntegerVariable)}"
有时你也需要插入到values / strings.xml中