Делаю фрагмент языковой игры, в которой будет соответствие слова и перевода. Мне нужно сохранить ранее нажатую кнопку и после нажатия на другую кнопку сравнить их, и если они совпадают, сделать их невидимыми.
Но я получаю сообщение об ошибке:
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;
Может кто поправил код? Есть ли правильный способ сохранить нажатые кнопки?
Братан, ты должен максимально упростить свой код. условие if смутит вас. вы можете разделить на несколько строк, чтобы получить более четкие результаты отладки
получить объявление и назначение с отведением кнопки от условия if для облегчения обнаружения ошибок.
@Boken Это целое число, инициализированное ранее. Он должен хранить идентификатор нажатой кнопки, и после того, как условие соответствует, я хочу использовать этот идентификатор, чтобы получить текст с кнопки (чтобы проверить наличие в массиве) и сделать его невидимым.
Объявите button_prev как поле в своей активности или фрагменте и используйте геттер и сеттер для доступа к нему внутри onclick.
Вы можете объявить 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;
}
}
Что такое
button_prev? Какой тип и как он инициализируется/создается?