Ich habe versucht, ein einfaches Programm zu erstellen, das eine kleine Zufallszahl abruft und dem Benutzer in einer Textansicht anzeigt. Nachdem ich endlich die Zufallszahl zum Generieren erhalten habe (denke ich), löst das Programm bei jedem Lauf eine schwerwiegende Ausnahme aus. Keine Fehler im Code, aber ich bin ein absoluter Neuling und fange einfach an, damit ich etwas lernen kann. Nach Stunden habe ich mich um Hilfe gebeten. Ich bin fast sicher, dass mein Snippet für Zufallszahlen im falschen Bereich liegt. Ich bin mir einfach nicht sicher, wo ich es platzieren soll. Überall habe ich versucht, den gleichen Fehler zu werfen.
Dies ist die .Java
package com.eai.vgp;
import Java.util.Random;
import Android.os.Bundle;
import Android.app.Activity;
import Android.view.Menu;
import Android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Random pp = new Random();
int a1 = pp.nextInt(10);
TextView tv = (TextView)findViewById(R.id.tv);{
tv.setText(a1);}
}
Das XML
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
Android:id="@+id/tv"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true" />
</RelativeLayout>
LogCat
03-03 16:34:25.313: I/Process(740): Sending signal. PID: 740 SIG: 9
03-03 16:35:02.212: E/Trace(806): error opening trace file: No such file or directory (2)
03-03 16:35:02.802: W/ResourceType(806): No package identifier when getting value for resource number 0x00000001
03-03 16:35:02.813: D/AndroidRuntime(806): Shutting down VM
03-03 16:35:02.813: W/dalvikvm(806): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
03-03 16:35:02.833: E/AndroidRuntime(806): FATAL EXCEPTION: main
03-03 16:35:02.833: E/AndroidRuntime(806): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.eai.vgp/com.eai.vgp.MainActivity}: Android.content.res.Resources$NotFoundException: String resource ID #0x1
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2059)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2084)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.ActivityThread.access$600(ActivityThread.Java:130)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1195)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.os.Handler.dispatchMessage(Handler.Java:99)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.os.Looper.loop(Looper.Java:137)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.ActivityThread.main(ActivityThread.Java:4745)
03-03 16:35:02.833: E/AndroidRuntime(806): at Java.lang.reflect.Method.invokeNative(Native Method)
03-03 16:35:02.833: E/AndroidRuntime(806): at Java.lang.reflect.Method.invoke(Method.Java:511)
03-03 16:35:02.833: E/AndroidRuntime(806): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:786)
03-03 16:35:02.833: E/AndroidRuntime(806): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
03-03 16:35:02.833: E/AndroidRuntime(806): at dalvik.system.NativeStart.main(Native Method)
03-03 16:35:02.833: E/AndroidRuntime(806): Caused by: Android.content.res.Resources$NotFoundException: String resource ID #0x1
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.content.res.Resources.getText(Resources.Java:229)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.widget.TextView.setText(TextView.Java:3620)
03-03 16:35:02.833: E/AndroidRuntime(806): at com.eai.vgp.MainActivity.onCreate(MainActivity.Java:22)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.Activity.performCreate(Activity.Java:5008)
03-03 16:35:02.833: E/AndroidRuntime(806): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1079)
03-03 16:35:02.833: E/AndroidRuntime(806): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2023)
03-03 16:35:02.833: E/AndroidRuntime(806): ... 11 more
03-03 16:35:05.113: I/Process(806): Sending signal. PID: 806 SIG: 9
Bewegung
Random pp = new Random();
int a1 = pp.nextInt(10);
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(a1);
In onCreate()
und tv.setText(a1);
in tv.setText(String.valueOf(a1));
ändern:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Random pp = new Random();
int a1 = pp.nextInt(10);
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(String.valueOf(a1));
}
Erste Ausgabe: findViewById()
wurde vor onCreate()
aufgerufen, wodurch eine NPE ausgelöst wurde.
Zweites Problem: Wenn Sie ein int direkt an ein TextView übergeben, wird die überladene Methode aufgerufen, die nach einer String-Ressource (aus R.string
) sucht. Daher möchten wir String.valueOf()
verwenden, um die überladene String
-Methode zu erzwingen.
Sie haben versucht, a.setText (a1) auszuführen. a1 ist ein int-Wert, aber setText () erfordert einen String-Wert. Aus diesem Grund müssen Sie String.valueOf (a1) verwenden, um den Wert von a1 als String und nicht als int an a.setText () zu übergeben. Beispiel:
a.setText(String.valueOf(a1))
das war die genaue Lösung für das Problem mit meinem Fall.
tv.setText( a1 + " ");
Dies wird Ihr Problem lösen.
Sie versuchen, den int-Wert auf TextView
zu setzen, damit Sie dieses Problem erhalten ... Um dieses Problem zu lösen, versuchen Sie es mit einer Option
option 1:
tv.setText(no+"");
Option 2:
tv.setText(String.valueOf(no));
Andere mögliche Lösung:
tv.setText(Integer.toString(a1)); // where a1 - int value
Dies kann immer in DataBinding passieren. Versuchen Sie, keine Logik in Ihre Bindungen einzufügen, einschließlich des Anhängens einer leeren Zeichenfolge. Sie können Ihren eigenen Adapter erstellen und ihn mehrmals verwenden.
@BindingAdapter("numericText")
fun numericText(textView: TextView, value: Number?) {
value?.let {
textView.text = value.toString()
}
}
<TextView app:numericText="@{list.size()}" .../>