Как сохранить предыдущую нажатую кнопку?

Делаю фрагмент языковой игры, в которой будет соответствие слова и перевода. Мне нужно сохранить ранее нажатую кнопку и после нажатия на другую кнопку сравнить их, и если они совпадают, сделать их невидимыми.

Но я получаю сообщение об ошибке:

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.Button.getText()' on a null object reference

На линии String text = buf.getText().toString();

Все кнопки были определены ранее.

@Override
public void onClick(View v) {

    if (button_prev != 9) {
        if (v.getId() != button_prev) {
            Button buf = (Button) v.findViewById(button_prev);
            String text = buf.getText().toString();

            if (book_array.indexOf(text) - book_array.indexOf((String) ((Button) v).getText()) != 0) {
                // book_array obj contains word and translating

                i--;
                v.findViewById(v.getId()).setVisibility(View.INVISIBLE);
                v.findViewById(button_prev).setVisibility(View.INVISIBLE);

            }
        }
    }

    switch (v.getId()) {
        // Storage the previously clicked the button in button_prev

        case R.id.button1:
            button_prev = Button_1.getId();
            // button_prev = R.id.button1;
            break;
        case R.id.button2:
            button_prev = Button_2.getId();
            break;
        case R.id.button3:
            button_prev = Button_3.getId();
            break;
        case R.id.button4:
            button_prev = Button_4.getId();
            break;
        case R.id.button5:
            button_prev = Button_5.getId();
            break;
        case R.id.button6:
            button_prev = Button_6.getId();
            break;
        case R.id.button7:
            button_prev = Button_7.getId();
            break;
        case R.id.button8:
            button_prev = Button_8.getId();
            break;

        default:
            break;

Может кто поправил код? Есть ли правильный способ сохранить нажатые кнопки?

Что такое button_prev? Какой тип и как он инициализируется/создается?

Boken 10.03.2019 00:47

Братан, ты должен максимально упростить свой код. условие if смутит вас. вы можете разделить на несколько строк, чтобы получить более четкие результаты отладки

med.Hamdan 10.03.2019 01:18

получить объявление и назначение с отведением кнопки от условия if для облегчения обнаружения ошибок.

med.Hamdan 10.03.2019 01:42

@Boken Это целое число, инициализированное ранее. Он должен хранить идентификатор нажатой кнопки, и после того, как условие соответствует, я хочу использовать этот идентификатор, чтобы получить текст с кнопки (чтобы проверить наличие в массиве) и сделать его невидимым.

Vitali Dzikoŭski 10.03.2019 12:55
0
4
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Объявите button_prev как поле в своей активности или фрагменте и используйте геттер и сеттер для доступа к нему внутри onclick.

  1. Ваша ошибка нулевого указателя может быть результатом воссоздания фрагмента, что приводит к недопустимому значению button_prev. И причиной может быть начальное значение button_prev.
  2. findViewById — это трудоемкая функция. Привязка представления должна быть обработана один раз и только один раз в onCreate().
  3. Лучше использовать MVC, MVP или MVVM. Используйте модель для описания вашей игровой логики. Сосредоточьтесь на изменении данных, и пользовательский интерфейс должен быть изменен вместе с ним.
Ответ принят как подходящий

Вы можете объявить POJO для представления lastclicked, как показано ниже, чтобы сохранить представление lastClicked.

public class LastViewClicked {

    private View view;

    public View getView() {
        return view;
    }

    public void setView(View view) {
        this.view = view;
    }
}

Теперь, когда вы нажимаете на любую кнопку, обновляйте объект представления внутри LastClickedView с помощью метода setView, и когда вам нужно знать, какая кнопка была нажата последней, вы создаете оператор переключения со всеми идентификаторами в качестве случаев, и если он соответствует, вы можете выполнить свою операцию .

    //  This Function gets the last clicked item which has opened up the Alert Dialog for
    //  selection and Updates its UI...
    private void UpdateLastClickedView(int position, ArrayAdapter arrayAdapter) {
        View v = lastViewClicked.getView();
        // cast according to your views...
        AppCompatTextView appCompatTextView = (AppCompatTextView) v;
        //  do your operation...
        switch(appCompatTextView.getId()){
          case R.id.tv1:
              // hide or whatever you want to do...
              break;
          case R.id.tv2:
              // hide or whatever you want to do...
              break;
        }
    }

Другие вопросы по теме