2014-12-05 3 views
2

나는 큰 괴상한 목장 가이드의 Android 프로그래밍 중 2 부에서 작업 중입니다. null 포인터 예외를 반환하는 UUID

UUID crimeID = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID); 

왜 EXTRA_CRIME_ID가 null 값을 반환 : 나는 시작에 충돌 응용 프로그램을 실행하고 고양이를 기록하려고 어떤 이유로 널 포인터 예외가 줄에 던져졌다라고?

가 여기에 예외가 발생 된 내 범죄 목록 조각입니다 :

package com.bignerdranch.android.criminalintent; 

import java.util.UUID; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.text.format.DateFormat; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.EditText; 

public class CrimeFragment extends Fragment { 
    public static final String EXTRA_CRIME_ID = 
      "com.bignerdranch.android.criminalintent.crime_id"; 

    private Crime mCrime; 
    private EditText mTitleField; 
    private Button mDateButton; 
    private CheckBox mSolvedCheckBox; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     **UUID crimeID = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);** 
     mCrime = CrimeLab.get(getActivity()).getCrime(crimeID); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ 
     View v =inflater.inflate(R.layout.fragment_crime, parent, false); 
     mTitleField = (EditText)v.findViewById(R.id.crime_title); 
     mTitleField.setText(mCrime.getTitle()); 
     mTitleField.addTextChangedListener(new TextWatcher() { 
      public void onTextChanged(CharSequence c, int start, int before, int count){ 
      mCrime.setTitle(c.toString()); 
     } 

     public void beforeTextChanged(CharSequence c, int start, int count, int after){ 
      //left blank 
     } 

     public void afterTextChanged(Editable c){ 
      //this one to 
     } 
    }); 

    mDateButton = (Button)v.findViewById(R.id.crime_date); 
    mDateButton.setText(DateFormat.format("hh:mm:ss", mCrime.getDate())); 
    mDateButton.setEnabled(false); 

    mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved); 
    mSolvedCheckBox.setChecked(mCrime.isSolved()); 
    mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      //set the crimes solved property 
      mCrime.setSolved(isChecked); 
     } 
    }); 

     return v; 
    } 

} 
+1

당신의'getArguments()'메소드는 널 (null)을 리턴 할 가능성이 높습니다. – Kon

+0

아마도이 하나가 도움이 될 수 있습니다. http://stackoverflow.com/questions/16561817/android-fragment-getarguments-returns-null –

답변

0

내가 아직 내 getArguments 있도록 인수를 정의하지 않았다 (는) null을 반환했다. 나는 사용해야했다

UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID); 

대신에 사용해야합니다.

---- ---- 업데이트 2014년 12월 16일

바와 같이 I 다른 활동에 사용되는 것을 방지하는 액티비티 단편을 연결 njzk2 지적. . BigNerdRanch 책은 독자가이 후자의 변경 방법을 추가 한 후 단순 이유로 이전 장에서 활동에 링크 :.

public static CrimeFragment newInstance(UUID crimeId){ 

    Bundle args = new Bundle(); 
    args.putSerializable(EXTRA_CRIME_ID, crimeId); 

    CrimeFragment fragment = new CrimeFragment(); 
    fragment.setArguments(args); 

    //pass UUID from extra 
    return fragment; 
} 

및 UUID crimeId = (UUID) getActivity() getIntent() 변경 getSerializableExtra를 (EXTRA_CRIME_ID);

UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID); 
+0

아니요. 조각을 만들 때'setArguments'를 호출해야합니다. 여기에서는 단편을 활동에 강하게 연결하여 활동에이 여분이없는 한 다른 활동에서이 단편을 사용하지 못하게합니다. 권장되는 방법은 조각에 정적 빌더를 사용하여 인수를 설정하는 것입니다. – njzk2

-2

에 다음 onCreate() 삭제 기능 CrimeActivity.java 파일을 찾을 수 있습니다.

관련 문제