Код не работает

#android #string #button #arraylist

#Android #строка #кнопка #список массивов

Вопрос:

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

Каждый раз при нажатии кнопки функция checkanswer проверяет, совпадает ли текст кнопки с правильным ответом на правильный вопрос.Если это так, он удаляет текущий вопрос и вызывает функцию getfirstquestion(), чтобы изменить вопрос.

Программа работает нормально, однако ничего не происходит, когда я нажимаю кнопку правильного ответа.Кто-нибудь может сказать мне, почему, и дать мне решение? Я ищу код с 2 часов назад….

     public class startgame extends Activity implements OnClickListener{

final Random rgenerator = new Random();

List<String> questionss1 = new ArrayList<String>();
String thequestion;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.level1);

    questionss1.add("Who is the actual CEO at Apple?");
    questionss1.add("Who is the actual CEO at Microsoft?");
    questionss1.add("Who is the actual CEO at Google?");
    getfirstquestion();

    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(this);

    Button button2 = (Button)findViewById(R.id.button2);
    button2.setOnClickListener(this);
    Button button3 = (Button)findViewById(R.id.button3);
    button3.setOnClickListener(this);
    Button button4 = (Button)findViewById(R.id.button4);
    button4.setOnClickListener(this);
    }
    }

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
    case R.id.button1:  

        Button button1 = (Button)findViewById(R.id.button1);
        checkanswer((String) button1.getText());

    case R.id.button2:
       Button button2 = (Button)findViewById(R.id.button2);
           checkanswer((String) button2.getText());

    case R.id.button3:
        Button button3 = (Button)findViewById(R.id.button2);
    checkanswer((String) button3.getText());

    case R.id.button4:
        Button button4 = (Button)findViewById(R.id.button2);
       checkanswer((String) button4.getText());
    }
}
public int checkanswer(String buttontext) {
    if (thequestion.equals("Who is the actual CEO at Apple?") amp;amp; buttontext == "Tim Cook"){
        questionss1.remove("Who is the actual CEO at Apple?");
        getfirstquestion();
    }

    if (thequestion.equals("Who is the actual CEO at Microsoft?") amp;amp; buttontext  == "Steve Ballmer"){
        questionss1.remove("Who is the actual CEO at Microsoft?");
        getfirstquestion();
    }

    if (thequestion.equals("Who is the actual CEO at Google?") amp;amp; buttontext == "Eric Schmidt"){
        questionss1.remove("Who is the actual CEO at Google?");
        getfirstquestion();
    }
    return 0;
}

public void getfirstquestion(){
    //create the buttons
    Button button1 = (Button)findViewById(R.id.button1);
    Button button2 = (Button)findViewById(R.id.button2);
    Button button3 = (Button)findViewById(R.id.button3);
    Button button4 = (Button)findViewById(R.id.button4);

    thequestion = questionss1.get(rgenerator.nextInt(questionss1.size()));
    TextView question = (TextView)findViewById(R.id.textView1);
    question.setText(thequestion);
    questionss1.remove(thequestion);

    if (thequestion.equals("Who is the actual CEO at Apple?")){
        List<String> questions1res = new ArrayList<String>();
        questions1res.add("Eric Schmidt");
        questions1res.add("Steven Sinofsky");
        questions1res.add("Tim Cook");
        questions1res.add("Steve Ballmer");

        button1.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button1.getText());
        button2.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button2.getText());
        button3.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button3.getText());
        button4.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button4.getText());
    }

    if (thequestion.equals("Who is the actual CEO at Microsoft?")){
        List<String> questions1res = new ArrayList<String>();
        questions1res.add("Eric Schmidt");
        questions1res.add("Steven Sinofsky");
        questions1res.add("Tim Cook");
        questions1res.add("Steve Ballmer");

        button1.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button1.getText());
        button2.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button2.getText());
        button3.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button3.getText());
        button4.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button4.getText());
    }

    if (thequestion.equals("Who is the actual CEO at Google?")){
        List<String> questions1res = new ArrayList<String>();
        questions1res.add("Eric Schmidt");
        questions1res.add("Steven Sinofsky");
        questions1res.add("Tim Cook");
        questions1res.add("Steve Ballmer");

        button1.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button1.getText());
        button2.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button2.getText());
        button3.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button3.getText());
        button4.setText(questions1res.get(rgenerator.nextInt(questions1res.size())));
        questions1res.remove(button4.getText());
    }
}
    }
 

Ответ №1:

В методе checkanswer вы должны использовать equals метод, а не == оператор, поскольку он сравнивает ссылки, а не содержимое объекта. т. е. вместо buttontext == "Tim Cook" него должно быть buttontext.equals("Tim Cook") etc.

Кроме того, еще раз взглянув на свой код, вы должны добавить break; инструкции в коммутатор:

 switch (v.getId()){
case R.id.button1:
    Button button1 = (Button)findViewById(R.id.button1);
    checkanswer((String) button1.getText());
    break;
case R.id.button2:
    Button button2 = (Button)findViewById(R.id.button2);
    checkanswer((String) button2.getText());
    break;
case R.id.button3:
    Button button3 = (Button)findViewById(R.id.button2);
    checkanswer((String) button3.getText());
    break;
case R.id.button4:
    Button button4 = (Button)findViewById(R.id.button2);
    checkanswer((String) button4.getText());
    break;
}
 

Комментарии:

1. теперь это сработало, но остановилось после первого вопроса. (кнопки просто не отвечают)

2. поскольку я скопировал некоторые коды, я забыл изменить номер кнопок (например, на кнопке 3 был номер 2) и так далее. Тем не менее, ваш код отлично сработал, спасибо!

Ответ №2:

button1.setOnClickListener(это);

Этот код используется для установки OnClickListener на кнопку. Вам нужно создать экземпляр OnClickListener в вашем классе и использовать его. Передача (this) будет передана в действие. Нажатие кнопки в этом случае ничего не даст.

Что-то вроде этого:

 button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // do your checking here
    }
};
 

Попробуйте, дайте мне знать, как это работает.

Комментарии:

1. Он использует действие в качестве OnClickListener, и это нормально.

2. @user1015311 — если это решило вашу проблему, отлично. Я просто хочу, чтобы вы знали, что, хотя я предпочитаю метод Pheonixblade9, который чище, чем использование Activity в качестве слушателя, использование Activity в качестве слушателя также допустимо и используется большинством людей.

3. @MByD Я даже не знал, что вы можете использовать activity в качестве OnClickListener! Ха-ха. Но мне кажется, что гораздо лучше иметь выделенных слушателей для каждой кнопки, если она не превышает 4. В противном случае я бы предложил OnTouchListener измерить точку, к которой он прикоснулся 🙂

4. @Pheonixblade9 — Ну, я согласен, что слушатель не должен быть Активностью в качестве стиля кодирования, но я думаю, что использование одного слушателя и соответствующих списков — гораздо лучший подход, чем слушатель для каждой кнопки.

5. @MByD Лично я бы создал один прослушиватель и установил для него все кнопки. Затем проверьте правильный ответ 🙂