2016-08-17 10 views
3

Краткое описание: Приложение будет отображать случайные изображения пользователю, основанным на словах из файла банковского слова и пользователь должен будет идентифицировать имя изображения (одно слово). Пользователь может либо «пройти», нажав кнопку «Пропустить», либо идентифицировать изображение, а затем появится «следующая» кнопка, направляющая их на следующее изображение.Использование случайного числа генерирует для отображения изображений от arraylist

Проблема: Приложение продолжает сбой прямо перед появлением новой следующей кнопки с разными изображениями при попытке нажать следующую кнопку.

Я думаю, что это имеет какое-то отношение к генератору случайных чисел или к проблеме с операторами if.

У меня нет сообщения об ошибке. Я не уверен, что вызывает проблему. Когда я запускаю файл apk, когда он падает, он говорит: «К сожалению, pic остановился» «pic» - это имя приложения.

EDIT: Когда я побежал приложение через эмулятор я получил сообщение об ошибке во время выполнения, как показано ниже

Следующая кнопка нажата и изменения к следующему изображению, которое является случайным кодом:

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

Первый элемент, содержащий «Банк слов:», который не является изображением, это просто имя списка слов, поэтому я сделал random.nextInt (maxsize) +1, который, как я полагаю, избегает 0, первый элемент, но когда дело доходит до арраиста, размер 2

(он падает прямо перед этой частью, но он сработает, когда эта кнопка также нажата.) В функции onActivityResult, если размер 2 или менее, то 2, он перестанет показывать следующую кнопку и покажет другая следующая кнопка, вызывающая функцию onlastPair, которые производят изображения, основанные на последнем элементе arraylist.

Основной код: Я взял код выключения функции, которые не связаны с вопросом, надеюсь, будет легче найти главную проблему.

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); 
    } 
} 

Любые идеи? Заранее спасибо!

EDIT: Сообщение об ошибке: Это сообщение об ошибке появляется каждый раз, когда я нажал кнопку last2image, и выдает сообщение аварии: «К сожалению, ПИК перестала запускаться»

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 

Функция, которая запускается при кнопка щелчок функция onlastPair(),

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(); 
      } 
     } 
    } 

изначально сообщение об ошибке относится к двум линиям ниже как часть ошибки:

if(!UnSpokenList.get(UnSpokenList.size()).contains("Word Bank:")) { 
        resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()), "drawable", getApplication().getPackageName()); 

поэтому я решил изменить функцию, показанную ниже,

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(); 
     } 
    } 
} 

, но она по-прежнему дает мне сообщение об ошибке теперь это время он указывает на строку:

 int max = UnSpokenList.size(); 

Я не конечно, что это не так, может быть, это моя логика, но мне кажется, что это имеет смысл для меня или чего-то не хватает. Любые идеи будут полезны, спасибо!

+0

Если вы получаете всплывающее окно типа «к сожалению, pic остановился», ваше приложение разбилось. Когда это происходит, всплывающее окно всегда появляется в logcat. Пожалуйста, поделитесь ею – 0xDEADC0DE

+0

Чтобы добавить: вы не всегда можете использовать этот случайный случай = (random.nextInt (UnSpokenList.size()) + 1); '. 'nextInt()' будет возвращать число от 0 до max - 1.Поскольку ваше максимальное значение представляет собой список, вы можете получить число, которое представляет последний элемент в вашем списке. Тем не менее, вы увеличиваете это значение, что означает, что вы, вероятно, получите 'IndexOutOfBoundException', потому что список 0 основан на – 0xDEADC0DE

+0

Первоначально я didnt, запустите через эмулятор, но когда я это сделал, я получил сообщение об ошибке, показанном в сообщении – Brandon

ответ

1

randomNum = (random.nextInt(UnSpokenList.size()) + 1); неверен

nextInt(15) дает # 0-14

если ваш UnSpokenList.size() == 15, это означает, что он имеет indicies от 0-14

так что если вы random.nextInt(UnSpokenList.size()) + 1) вы на самом деле RNG для номеров, 15 + 1, которые будут от 0 до 15

будет падать за пределы ваших указаний 0-14

игнорировать ваши UnSpokenList(0) ...

вам нужно изменить его на: random.nextInt(UnSpokenList.size() - 1) + 1

размером 15-1 будет RNG 0-13, то +1, сделает 1-14, который идеально подходит для UnSpokenList(1) - UnSpokenList(14)

мы можем проверить это для UnSpokenList.size() = 2

random.nextInt(2 - 1) + 1 = только-0 + 1 = только-1

EDIT

if(!UnSpokenList.get(1).isEmpty()) вы пытаетесь проверить, если ваш список более чем на 1 пункт? если да, то ваш может бросить индекс_идентификатор ошибку, он должен быть if (UnSpokenList.size() > 1)

затем еще раз, int max = UnSpokenList.size() ... UnSpokenList.get(max) вы даете ему индекс вне границ, 0-14, но вы получите (15), это не будет работать

+0

исправлено, но я все еще получаю крах – Brandon

+0

до и после вашего 'randomNum = ...' помещают эти журналы: 'Log.d (tag," size: "+ UnSpokenList.size())', затем 'Log.d (tag, "рэнд:" + randomNum) '. это значительно поможет вам диагностировать ошибки индекса, а когда он сработает, просмотрите эти 2 журнала. – TWL

+0

Раньше я получал пустое изображение, теперь это не случайная функция, но она решила одну из моих проблем. Спасибо! у вас есть какие-либо идеи о проблеме с крушением, которую я просто обновляю в сообщении? – Brandon

 Смежные вопросы

  • Нет связанных вопросов^_^