2016-08-17 4 views
3

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

gezeigt

Die 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!

+0

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

+0

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

+0

Ursprünglich habe ich nicht, führen Sie die durch den Emulator, aber wenn ich das tat, habe ich die Fehlermeldung in Post – Brandon

Antwort

1

randomNum = (random.nextInt(UnSpokenList.size()) + 1); ist falsch

nextInt(15) gibt # 0-14

wenn Ihr UnSpokenList.size() == 15, das heißt, es indicies 0-14

so hat, wenn Sie random.nextInt(UnSpokenList.size()) + 1) tun, sind Sie tatsächlich RNG Für Nummern, 15 + 1, die von 0 bis 15 sind

fallen außerhalb Ihrer Indizes von 0-14

ignorieren Ihre UnSpokenList(0) ...

Sie es ändern müssen: random.nextInt(UnSpokenList.size() - 1) + 1

Größe 15-1 wird rng 0-13, dann +1, wird es 1-14 machen, das ist perfekt für UnSpokenList(1)-UnSpokenList(14)

wir 1 = nur-0 + UnSpokenList.size() = 2

random.nextInt(2 - 1) + 1 = für nur-1

dies testen

EDIT

if(!UnSpokenList.get(1).isEmpty()) versuchen Sie zu überprüfen, ob Ihre Liste mehr als 1 Einzelteil hat? wenn ja, kann Ihr Index-Fehler werfen, sollte es if (UnSpokenList.size() > 1)

dann einmal wieder, int max = UnSpokenList.size() ... UnSpokenList.get(max) Sie geben es einen Index außerhalb der Grenzen, 0-14, aber man bekommt (15), ist es nicht

zur Arbeit gehen
+0

behoben, aber ich bekomme immer noch den Absturz – Brandon

+0

vor und nach Ihrem 'randomNum = ...' setzen Sie diese Protokolle: 'Log.d (Tag," Größe: "+ UnSpokenList.size())', dann 'Log.d (Tag, "rand:" + zufälligesNum) '. Dies hilft Ihnen bei der Diagnose von Indexfehlern, und wenn es abstürzt, sehen Sie sich diese 2 Protokolle an. – TWL

+0

Ich habe vorher ein leeres Bild getippt, es ist jetzt nicht die Zufallsfunktion, aber es hat eines meiner Probleme gelöst. Vielen Dank! Hast du eine Ahnung von dem Crash-Problem, das ich gerade in der Post aktualisiert habe? – Brandon

Verwandte Themen