>

단어와 번역이 일치하는 언어 게임 조각을 만들고 있습니다. 이전에 클릭 한 버튼을 저장해야하며 다른 버튼을 클릭 한 후 비교하고 보이지 않는 경우 일치하는지 확인하십시오.

그러나 오류가 발생합니다 :

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;


어쩌면 누군가 코드를 고칠 수 있을까요? 클릭 한 버튼을 저장하는 올바른 방법이 있습니까?


  • 답변 # 1

    lastClicked보기를 저장하기 위해 다음과 같이 lastclicked보기에 대한 POJO를 선언 할 수 있습니다.

    public class LastViewClicked {
        private View view;
        public View getView() {
            return view;
        }
        public void setView(View view) {
            this.view = view;
        }
    }
    
    

    이제 어떤 버튼을 클릭하면 setView 메소드를 사용하여 LastClickedView 내부의 뷰 객체를 업데이트하고 마지막으로 클릭 한 버튼이 무엇인지 알아야 할 때 모든 ID가있는 스위치 문을 작성합니다. 작업을 수행하십시오.

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

  • 답변 # 2

    널 포인터 오류는 조각 재생의 결과 일 수 있으며, 이로 인해 button_prev 값이 유효하지 않습니다. button_prev의 초기 값이 그 이유 일 수 있습니다.

    findViewById는 시간이 많이 걸리는 기능입니다. 뷰 바인딩은 onCreate ()에서 한 번만 처리해야합니다.

    MVC, MVP 또는 MVVM을 사용하는 것이 좋습니다. 게임 로직을 설명하는 모델을 사용하십시오. 데이터 변경에 집중하면 UI를 변경해야합니다.

  • 답변 # 3

    액티비티 또는 프래그먼트에서 button_prev를 필드로 선언하고 getter 및 setter를 사용하여 onclick 내에서 액세스하십시오.

관련 자료

  • 이전 javascript - autodesk forge viewer - "viewermodelsearch"및"viewergetselection ()"에서 다른 값 dbid 가져 오기
  • 다음 azure active directory - loginmicrosoftonlinecom 도메인에서 Javascript (script) 태그를 사용할 수 없습니다