2015-01-26 2 views
-1

Я пытаюсь создать приложение, на котором я могу читать стихи, хранящиеся в массиве через массив. Он содержит 2 кнопки «Следующий» & «Назад»Android: Помогите! Приложение перестало работать

Все работает нормально, но когда я дойду до конца массива, и я нажимаю дальше, он перестает работать. и наоборот для обратного ключа.

package com.example.haziqsheikhlocal.ghanwapoems; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Switch; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.Random; 


public class GhanwaPoems extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ghanwa_poems); 

     final TextView myPoem1 = (TextView) findViewById(R.id.myPoem); 
     final Button nextButton = (Button) findViewById(R.id.buttonNext); 
     final Button backButton = (Button) findViewById(R.id.backButton); 



     View.OnClickListener backListen = new View.OnClickListener() { 
      public int kK =0; 
      @Override 
      public void onClick(View v) { 
       String[] mPoemBooks = getStrings(); 


       if (kK <= mPoemBooks.length - 1 || kK >= 1){ 
        switch (v.getId()) // v is the button that was clicked 
        { 
         case(R.id.buttonNext): 
          kK++; 
          break; 
         case (R.id.backButton): 
          kK--; 
          break; 
         default: // this will run the same code for any button clicked that doesn't have id of button1 defined in xml 

          break; 

        } 
        int k = kK; 
        String myPoem = ""; 
        myPoem = mPoemBooks[k]; 



        myPoem1.setText(myPoem); 
       } 
else { 
        Toast.makeText(getApplicationContext(), " Sorry No More To Show" , Toast.LENGTH_LONG).show(); 
       } 

      } 
}; 
         backButton.setOnClickListener(backListen); 
         nextButton.setOnClickListener(backListen); 

    } 

    private String[] getStrings() { 
     return new String[]{"","a","b","c","d","e","f"}; 
    } 
} 

Что мне нужно, это логика или состояние, так что, когда я добраться до конца моего массива он должен показать «Sorry No More Стихотворения.» и наоборот для кнопки «Назад».

и извините за испорченный код его первый раз, когда я делаю что-то: P

+0

Мои Условия неправильные Я знаю, что, но ват, должно ли это быть? –

+0

Возможный дубликат [К сожалению, MyApp остановлен. Как я могу это решить?] (Http://stackoverflow.com/questions/23353173/unappro-myapp-has-stopped-how-can-i-solve-this) – njzk2

+0

выполнить минимальную отладку перед запросом. – njzk2

ответ

0

Там много здесь происходит, что необходимо внимание:

1: Метод OnCreate() следует использовать только для создания активности для вещей, которые должны произойти при создании деятельности. Установка слушателя здесь прекрасно, но беден код практики, чтобы определить ваши анонимные классы там

2: Это проще всего использовать два слушателя, или использовать свойства OnClick в макете

3: текущее стихотворение элемент, который относится к деятельности, поэтому она должна быть членом этого класса

4: Я предполагаю, что вы будете хотеть более постоянный запас деталей вы отображающие, но это несколько шагов вниз по дороге

Вот быстрая реализация первых 3:

public class Poems extends Activity { 

    private int currentPoem; 
    private TextView mPoemView; 
    private String[] mPoems = new String[] {...} 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super(savedInstanceState); 
     setContentView(R.layout.activity_ghanwa_poems); 

     mPoemView = (TextView) findViewById(R.id.myPoem); 
     Button nextButton = (Button) findViewById(R.id.nextButton); 
     Button backButton = (Button) findViewById(R.id.backButton); 

     nextButton.setOnClickListener(mNextListener); 
     backButton.setOnClickListener(mBackListener); 
    } 

    private View.OnClickListerner mNextListener 
      = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (currentPoem < mPoems.length - 1) { 
       mPoemView.setText(mPoems[++currentPoem]) 
      } 
     } 
    }; 

    private View.OnClickListerner mBackListener 
      = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (currentPoem > 0) { 
       mPoemView.setText(mPoems[--currentPoem]) 
      } 
     } 
    }; 
} 

Удачи и добро пожаловать в кодировку.

+0

На самом деле я пытался создавать разные классы, один для хранения стихов, а другой - для переключения! но я не мог этого сделать ..... Я изучаю онлайн-уроки из дома Teamtree и Lynda .. так что m совершенно новый –

+0

и спасибо Alot ive узнал от вас новую вещь :) –

1

Вам, если утверждение всегда верно. Это должно работать для вас:

если (кК < = mPoemBooks.length - 1 & & кК> = 0) {

0

Похоже, вы получаете индекс из ошибки границ. Это означает, что вы пытаетесь получить доступ к объекту в массиве (mPoemBooks), который не существует. В случае backButton вы, скорее всего, получаете -1 в качестве индекса, а с помощью buttonNext вы получаете нечто большее, чем массив.

Чтобы исправить это, вы должны убедиться индекс находится в пределах

int k = kK; 
String myPoem = ""; 

if (k < 0) { 
    k = 0; 
} 

if (k >= mPoemBooks.length()) { 
    k = mPoemBooks.length() -1; //Subtract 1 since arrays are 0 indexed and length is 1 indexed. 
} 
myPoem = mPoemBooks[k]; 
Смежные вопросы