Kurzbeschreibung: Die Anwendung zeigt dem Benutzer zufällige Bilder basierend auf den Wörtern aus der Bankdatei an und der Benutzer muss den Namen des Bildes identifizieren (einzelnes Wort)). Der Benutzer kann entweder durch Klicken auf den Pass-Button "passen" oder das Bild identifizieren und dann erscheint der "Next" -Button, der ihn zum nächsten Bild führt.Verwenden von Zufallsgenerierung zum Anzeigen von Bildern aus einer Arraylist
Problem: Die Anwendung stürzt ab, bevor die neue nächste Schaltfläche mit verschiedenen Bildern erscheint, wenn ich versuche, die nächste Schaltfläche zu drücken.
Ich denke, dass es etwas mit dem Zufallszahlengenerator zu tun hat oder ein Problem mit den if-Anweisungen, die ich platziert habe.
Ich bekomme keine Fehlermeldung. Ich bin mir nicht sicher, was das Problem verursacht. Wenn ich die APK-Datei ausführen, wenn es abstürzt sagt es "leider hat Bild gestoppt" "pic" ist der App-Name.
EDIT: Wenn ich die App durch den Emulator lief ich eine Laufzeitfehlermeldung bekam, unter
gezeigtDie nächste Schaltfläche geklickt wird und wechselt zum nächsten Bild, das randomisiert durch den Code ist:
das erste Element, enthält "Word Bank:" das ist kein Bild, es ist nur der Name der Liste des Wortes, also habe ich random.nextInt (maxsize) +1, die ich vermutet, vermeidet 0, die erstes Element, aber wenn es um die Arraylist kommt, haben Sie die Größe von 2
(es stürzt direkt vor diesem Teil ab, aber es stürzt ab, wenn auch dieser nächste Knopf gedrückt wird.) In der onActivityResult
Funktion, wenn es 2 oder weniger als 2 ist, wird diese nächste Schaltfläche nicht mehr angezeigt und a angezeigt verschiedene Next-Buttons, die die Funktion onlastPair aufrufen, die Bilder basierend auf dem letzten Element der Arraylist erzeugen.
Haupt Code: habe ich einige Codes aus Funktionen, die nicht mit dem Problem verknüpft sind hoffentlich wird es leichter sein, das Hauptproblem zu finden.
public class Main extends Activity implements AdapterView.OnItemSelectedListener {
private static final int VR_Request = 100;
Button restart;
Button mainMenu;
Button pass;
Button next;
Button last2image;
TextView speechInput;
TextView matchOrNot;
TextView passTitle;
TextView counterDisplay;
String[] wordBank;
ArrayList<String> wordBANK;
Spinner wordList;
Spinner SpokenWords;
ArrayList<String> UnSpokenList;
ArrayList<String> SpokenList;
ArrayAdapter<String> wordList_adapter;
ArrayAdapter<String> SpokenList_adapter;
ImageButton speechBtn;
ImageView image;
Resources res;
int resID;
Random random;
int randomNum;
int previous;
int passCounter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pictionary);
speechInput = (TextView) findViewById(R.id.english_word1);
matchOrNot = (TextView) findViewById(R.id.matchOrNot1);
passTitle = (TextView) findViewById(R.id.passedTitle);
counterDisplay = (TextView) findViewById(R.id.passCounterText);
wordBank = getResources().getStringArray(R.array.Words);
speechBtn = (ImageButton) findViewById(R.id.mic_pic_button1);
wordBANK = new ArrayList<String>(Arrays.asList(wordBank));
image = (ImageView) findViewById(R.id.imageView1);
res = getResources();
restart = (Button) findViewById(R.id.restartButton1);
mainMenu = (Button) findViewById(R.id.mainMenubutton1);
pass = (Button) findViewById(R.id.passButton);
next = (Button) findViewById(R.id.nextButton);
last2image = (Button) findViewById(R.id.last2);
pass.setClickable(true);
wordList = (Spinner) findViewById(R.id.wordsList1);
SpokenWords = (Spinner) findViewById(R.id.spokenWords1);
UnSpokenList = new ArrayList<String>(Arrays.asList(wordBank));
SpokenList = new ArrayList<String>(wordBank.length+1);
UnSpokenList.add(0, "Word Bank:");
SpokenList.add(0,"Spoken Words:");
wordList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, UnSpokenList);
wordList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
wordList.setAdapter(wordList_adapter);
SpokenList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SpokenList);
SpokenList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
SpokenWords.setAdapter(SpokenList_adapter);
random = new Random();
randomNum = random.nextInt(UnSpokenList.size()-1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
speechBtn.setClickable(true);
last2image.setVisibility(View.INVISIBLE);
last2image.setClickable(false);
passCounter = 0;
restart.setVisibility(View.INVISIBLE);
mainMenu.setVisibility(View.INVISIBLE);
passTitle.setVisibility(View.INVISIBLE);
counterDisplay.setVisibility(View.INVISIBLE);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void onMicButton(View view) {
}
/**
* When the next button is pressed, this function handles the next random image to be displayed
* @param view
*/
public void onNext(View view){
if(view.getId() == R.id.nextButton){
speechInput.setText("");
matchOrNot.setText("");
randomNum = (random.nextInt(UnSpokenList.size()) + 1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
speechBtn.setClickable(true);
}
}
/**
* This function occurs when the user plays all the way to last 2 image left in game
*/
public void onlastPair(View view){
if(view.getId() == R.id.last2){
if(!UnSpokenList.get(UnSpokenList.size()).contains("Word Bank:")) {
resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
speechBtn.setClickable(true);
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
}else {
onGameOver();
}
}
}
public void onGameOver(){
}
/**
* when the user clicks the passed button this function is called.
* It takes the previous image and make sure it does not pop-up again for the next image and then reproduce a different image
* @param view
*/
public void onPass(View view){
}
public void onResetPic(View view){
}
public void reset(){
}
public void MainMenu(View view){
}
/**
* shows speech input dialog
*/
public void promptSpeechInput() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.ACTION_RECOGNIZE_SPEECH, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a Word from our word bank!");
try {
startActivityForResult(intent, VR_Request);
} catch (ActivityNotFoundException a) {
Toast.makeText(Pictionary.this, "Oops, your device doesn't support speech recognition,", Toast.LENGTH_LONG).show();
}
}
/**
* detects and recieve speech input
* @param requestCode
* @param resultCode
* @param intent
*/
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode == VR_Request && resultCode == RESULT_OK) {
ArrayList<String> result = intent.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if(wordBANK.contains(result.get(0).toLowerCase()) && UnSpokenList.get(randomNum).contains(result.get(0).toLowerCase())){
speechInput.setText(result.get(0).toUpperCase());
matchOrNot.setTextColor(Color.GREEN);
matchOrNot.setText("CORRECT!");
UnSpokenList.remove(result.get(0).toLowerCase());
SpokenList.add(result.get(0).toLowerCase());
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
speechBtn.setClickable(false);
if(UnSpokenList.size() > 3){
next.setClickable(true);
next.setVisibility(View.VISIBLE);
}else{
last2image.setVisibility(View.VISIBLE);
last2image.setClickable(true);
}
}else{
speechInput.setText("");
matchOrNot.setTextColor(Color.RED);
matchOrNot.setText("TRY AGAIN!");
pass.setVisibility(View.VISIBLE);
pass.setClickable(true);
}
}
super.onActivityResult(requestCode, resultCode, intent);
}
}
Irgendwelche Ideen? Vielen Dank im Voraus!
EDIT: Fehlermeldung: Diese Fehlermeldung jedes Mal, ich tritt die last2image Taste gedrückt und gibt den Absturz Meldung: „leider pic wird nicht mehr ausgeführt“
08-17 15:58:31.083 13036-13036/com.example.speechtotext E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.speechtotext, PID: 13036
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.example.speechtotext.Main.onlastPair(Main.java:222)
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 15:58:33.495 13036-13036/com.example.speechtotext I/Process: Sending signal. PID: 13036 SIG: 9
08-17 15:58:33.966 17345-17345/com.example.speechtotext W/System: ClassLoader referenced unknown path: /data/app/com.example.speechtotext-2/lib/x86
08-17 15:58:34.302 17345-17345/com.example.speechtotext W/System: ClassLoader referenced unknown path: /data/app/com.example.speechtotext-2/lib/x86
08-17 15:58:34.673 17345-17345/com.example.speechtotext W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-17 15:58:34.748 17345-17386/com.example.speechtotext D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
[ 08-17 15:58:34.759 17345:17345 D/ ]
HostConnection::get() New Host Connection established 0xaa23f4c0, tid 17345
08-17 15:58:34.828 17345-17386/com.example.speechtotext I/OpenGLRenderer: Initialized EGL, version 1.4
08-17 15:58:34.885 17345-17386/com.example.speechtotext W/EGL_emulation: eglSurfaceAttrib not implemented
08-17 15:58:34.888 17345-17386/com.example.speechtotext W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xaa23e540, error=EGL_SUCCESS
Die Funktion, die ausgeführt wird, wenn der Knopf klicken, die onlastPair() -Funktion ist,
public void onlastPair(View view){
if(view.getId() == R.id.last2){
if(!UnSpokenList.get(UnSpokenList.size()).contains("Word Bank:")) {
resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
speechBtn.setClickable(true);
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
}else {
onGameOver();
}
}
}
ursprünglich die Fehlermeldung an die beiden Zeilen im folgenden als Teil eines Fehler gerichtet:
if(!UnSpokenList.get(UnSpokenList.size()).contains("Word Bank:")) {
resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()), "drawable", getApplication().getPackageName());
so habe ich beschlossen, die Funktion unten zu verändern,
public void onlastPair(View view){
if(view.getId() == R.id.last2){
if(!UnSpokenList.get(1).isEmpty()) {
int max = UnSpokenList.size();
resID = res.getIdentifier(UnSpokenList.get(max), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
speechBtn.setClickable(true);
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
}else {
onGameOver();
}
}
}
aber es mir immer noch einen Fehler, jetzt es diesmal auf der Linie zeigen wird:
int max = UnSpokenList.size();
Ich bin nicht Sicher, was es falsch ist, vielleicht ist es meine Logik, aber es scheint für mich Sinn oder etwas fehlt mir. Irgendwelche Ideen werden hilfreich sein, Danke!
Wenn Sie ein Popup-Fenster wie "leider, Bild wurde gestoppt" erhalten, ist Ihre App abgestürzt. Wenn dies passiert, erscheint immer ein Popup in logcat. Bitte teilen Sie es – 0xDEADC0DE
Hinzufügen: Sie können nicht immer diese 'randomNum = (random.nextInt (UnSpokenList.size()) + 1);'. 'nextInt()' gibt eine Zahl zwischen 0 und max - 1 zurück.Da Ihr Maximalwert eine Liste ist, können Sie eine Zahl erhalten, die das letzte Element in Ihrer Liste darstellt. Allerdings erhöhen Sie diesen Wert, was bedeutet, dass Sie wahrscheinlich eine "IndexOutOfBoundException" erhalten, weil eine Liste 0-basiert ist – 0xDEADC0DE
Ursprünglich habe ich nicht, führen Sie die durch den Emulator, aber wenn ich das tat, habe ich die Fehlermeldung in Post – Brandon