2013-03-24 2 views
1

아직 NPE를 받고 있지만 이제는 내 onCreate()에서 가져 왔습니다. 버튼을 제거하면 모든 것이 잘 작동합니다. 여기 NPE (편집 됨) 받기

(각 테이블 행은 별도의 XMLS 출신)가 XML입니다 : 여기

@Override 
public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.doneP1: 
      checkTurn(); 
      break; 
     case R.id.doneP2: 
      checkTurn(); 
      break; 
     case R.id.resetP1: 
      break; 
     case R.id.resetP2: 
      break; 
     } 
} 

가있다

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

     /*doneP1 = (Button) this.findViewById(R.id.doneP1); 
     doneP2 = (Button) this.findViewById(R.id.doneP2); 
     resetP1 = (Button) this.findViewById(R.id.resetP1); 
     resetP2 = (Button) this.findViewById(R.id.resetP2); 

     checkTurn(); //starts the game 

     //buttons 
     doneP1.setOnClickListener(this); 
     doneP2.setOnClickListener(this); 
     resetP1.setOnClickListener(this); 
     resetP2.setOnClickListener(this);*/ //commented out 
    } 

및 외부에서 onCreate : 여기

<TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="50dp" > 

     <Button 
      android:id="@+id/doneP1" 
      android:layout_width="50dp" 
      android:layout_height="wrap_content" 
      android:text="Done" /> 

     <Button 
      android:id="@+id/resetP1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Reset" /> 

    </TableRow> 

<TableRow 
      android:id="@+id/tableRow1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="50dp" > 

      <Button 
       android:id="@+id/doneP2" 
       android:layout_width="50dp" 
       android:layout_height="wrap_content" 
       android:text="Done" /> 

      <Button 
       android:id="@+id/resetP2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Reset" /> 

     </TableRow> 

코드입니다 체크 아웃

여기

가 changelayout입니다 : 여기에 로그 캣

을 것

public void changeLayout(int turn) 
{ 
    FragmentManager fm  = getSupportFragmentManager(); 
    Fragment  fragment = fm.findFragmentById(R.id.fragment_container); 
    FragmentTransaction ft; 

    if(turn == 1) //if its player 1's turn 
    { 
     doneP1 = (Button) this.findViewById(R.id.doneP1); 
     resetP1 = (Button) this.findViewById(R.id.resetP1); 
     doneP1.setOnClickListener(this); 
     resetP1.setOnClickListener(this); 
     if(fragment == null) //checks wether the current framelayout contains a fragment or not 
     { 
      ft = fm.beginTransaction(); 
      ft.add(R.id.fragment_container, new PlayerTurn1()); 
      ft.commit(); 
      //setPlayer1(); 
     } 
     else 
     { 
      ft = fm.beginTransaction(); 
      ft.replace(R.id.fragment_container, new PlayerTurn1()); 
      ft.commit(); 

     } 
    } 
    else 
    { 
     doneP2 = (Button) this.findViewById(R.id.doneP2); 
     resetP2 = (Button) this.findViewById(R.id.resetP2); 
     doneP2.setOnClickListener(this); 
     resetP2.setOnClickListener(this); 
     if(fragment == null) 
     { 
      ft = fm.beginTransaction();; 
      ft.add(R.id.fragment_container, new PlayerTurn2()); 
      ft.commit(); 
      //setPlayer2(); 
     } 
     else 
     { 
      ft = fm.beginTransaction();; 
      ft.replace(R.id.fragment_container, new PlayerTurn2()); 
      ft.commit(); 
     } 
    } 
} 

을 (EDIT? 새로운 changeLayout, 나는 그냥 방법하지만 여전히 아무런 영향을 미치지 내부의 각 버튼을 다시 초기화, 나는 바로 그 일을하고있다)와

03-24 07 : 51 : 55.954 : E/AndroidRuntime (5092) : 원인 : java.lang.NullPointerException 03-24 07 : 51 : 55.954 : E/AndroidRuntime (5092) : 에서 As2.packageTK.TicTacToeGame .onCreate (TicTacToeGame.java:88)

,451,515,

라인 (88)은 : 지금 약 4 시간 동안이 작업을 봤는데 난 여전히 간단한 문제를 해결할 수 없습니다

doneP1.setOnClickListener(this); 

. 머리가 졸졸 빠져서 정말 피곤합니다. 잠자기 전에이 문제를 해결하고 싶으므로 빠른 응답을 부탁드립니다. 나는 나의 문제를 깨끗이 닦았다. .. 아무것도. 모든 것이 잘 보인다하지만 ... NPE는 항상에 파산한다.

+1

plz 또한 checkTurn()을 추가하십시오. 질문이 –

+0

인 코드를 추가했습니다. 임 코드가 맞다는 것이 확실하지만 버튼의 코드를 제거 할 때마다 작동합니다.- – Morpheglus

+0

@ user2203939 레이아웃 파일을 저장하고 정리하고 프로젝트를 다시 빌드했는지 다시 한번 확인하고 여전히 오류? – Tushar

답변

0

당신이 doneP1가 null 것을 의미

doneP1.setOnClickListener(this); 

에 NPE를 얻을 경우. 당신은 print/loggin doneP1, doneP2, resetP1과 resetP2 (물론 88 행 이전)를 점검했다. 예 :

Log.d(TAG, "doneP1 = "+doneP1); 
Log.d(TAG, "doneP2 = "+doneP2); 
... 

내 생각에 모든 구성 요소가 null입니다. 즉, 잘못된 레이아웃을로드하고있는 것입니다. 아니면 처음부터 올바른로드하지만 당신은

public void changeLayout(int turn) 

편집에 뭔가 다른 그것을 변경 :

귀하의 TableRows가 다른 레이아웃에?

"Here are the XML(each table rows are from separate XMLs):" 

물론 P2 레이아웃을로드 할 때 P1 구성 요소는 null이되며 반대의 경우도 마찬가지입니다.

EDIT2 :

이 changeLayout에 대한 참조를로드합니다.화면에 동시에 두 개의 버튼 (재설정 및 완료)이 있으므로 실제로는 두 개의 참조 만 필요합니다 (예 : donep1과 donep2가 필요하지 않음). 그런 다음 레이아웃을 변경하면 참조가 올바른 버튼으로 변경됩니다. 따라서 버튼을 눌렀을 때 자신의 차례가 필요한 논리가 필요합니다.

+0

아직 로그를 확인하지는 않았지만 tablerows는 다른 레이아웃에 있습니다. 그들은 파편 안에 넣어지기 때문에 있어야합니다. 각 레이아웃은 플레이어를 나타내며 각 플레이어는 2 개의 버튼을 가지고 있습니다 ... 어떻게 그 모든 구성 요소가 null 일 수 있는지 보지 못합니다. 내가보기에는 그들을 바꾸지 않을 것입니다. 로깅을 확인하고 인쇄 해 보겠습니다. – Morpheglus

+0

Player1의 레이아웃을로드 한 경우; Player2의 구성 요소는 null이됩니다. 맞습니까? – jelgh

+0

그래, 문제는 changeLayout() 메서드가 호출 될 때마다 fragment1이 fragment2로 대체 되었기 때문에 기본적으로 두 조각의 각 버튼에 대한 ID 참조가 손실된다는 것입니다. 나는 그것을 고치기 위해 내가 시도한 것을 업데이트했지만, 여전히 좋지는 않습니다. – Morpheglus

0

당신이 onCreate에서 그보기 점점 보면 :

doneP1 = (Button) this.findViewById(R.id.doneP1); 
    doneP2 = (Button) this.findViewById(R.id.doneP2); 
    resetP1 = (Button) this.findViewById(R.id.resetP1); 
    resetP2 = (Button) this.findViewById(R.id.resetP2); 

을하지만 당신은 설정을 변경하고있는 레이아웃을 변경 후 :

public void checkTurn() 
{ 
    if(turn == 1) 
    { 
     changeLayout(turn); 
     turn = 2; 
    } 
    else 
    { 
     changeLayout(turn); 
     turn = 1; 
    } 
} 

이 실행 :

ft.replace(R.id.fragment_container, new PlayerTurn1()); 

기본적으로 이러한보기에 대한 참조가 손실됩니다. 더 이상 존재하지 않기 때문에. 그들은 다른 조각의 견해로 대체되었습니다.

편집 :

alternatice 레이아웃 파일에 onClick 속성을 설정하는 것입니다 :

public void onDoneButtonOnClick (View v) 
{ 
     // do here what every you want with this button. 
} 
:

이 (가)

및 활동에 "android:onClick="onDoneButtonOnClick"이 방법을 만들 세트

이 경우의 구현을 제거해야합니다. 귀하의 활동에서.

+0

나는 당신이 의미가 있다고 생각합니다. 따라서 조각을 재현/교체하는 동안 나는 그것들을 초기화해야한다는 것을 의미합니까? – Morpheglus

+0

기본적으로 레이아웃을 대체 한 후에 새로 교체 된 조각 레이아웃의 새 뷰를 참조하기 위해 4 개의 뷰에 대해 findByViewId 메서드를 다시 4 번 실행해야합니다. –

+0

그래서 changeLayout이 호출 될 때마다 단추를 다시 초기화해야합니다. 나는 그것을 시험해 볼만하다. 편집 : 방금 테스트되었지만 작동하지 않습니다. 내가 뭔가 잘못하고있을 수도 있지만 매번 reintializing하는 대신 그것을 할 단순화 된 방법이 무엇입니까? – Morpheglus