アプリを実行すると、タイトルから例外が発生します。ハングマンゲームの単語を含む.txtファイルがあり、ファイルにアクセスすると例外がスローされると思います。私のファイルcuvinte.txtは/ assets /にあります。ここに私のコードがあります(私はうまく動作するlayout/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()関数で呼び出されます。
(単なる仮定、例外スタックトレースの情報が少ない)
valIncercari
はint
であるため、この行、incercari.setText(valIncercari);
は例外をスローすると思います
だから、あるべき
incercari.setText(valIncercari+"");
または
incercari.setText(Integer.toString(valIncercari));
このエラーがスローされる可能性がある別の理由を指摘したかったのは、アプリの1つの翻訳に対して文字列リソースを定義したが、デフォルトの文字列リソースを提供しなかった場合です。
以下に示すように、スペイン語の文字列「get_started」の文字列リソースがありました。それでもコードで参照できますが、電話がスペイン語でない場合は、getString()
を呼び出すときにロードおよびクラッシュするリソースがありません。
values-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
にデフォルトの文字列リソースがあることを確認してください。
values/strings.xml
<string name="get_started">Get Started</string>
values-en/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>
この例外を引き起こす可能性がある別のシナリオは、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)}"
この問題は、主にsetText()
メソッドのエラーが原因で発生します
解決策は、次のようにInteger
型に変換してstring
値を置くだけです
textview.setText(Integer.toString(integer_value));
DataBindingを使用し、drawableフォルダーのリソースを使用して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"
に変更するだけです
プロジェクトをクリーンおよびリビルドします。
いつか、アダプタからテキストビューにテキストを設定する場合など、ソースが好きではないために発生しました
textView.setText(""+name);
あなたが何かを書くなら
textView.setText(name);
これは機能せず、string.xmlファイルからリソースが見つからない場合、このタイプのエラーが発生します。