2013-03-17 4 views
5

내 클래스가 DialogFragment에 인수를 전달해야하지만 내 앱이 NullPointerException에 대해 onCreate 메서드 (대화 클래스의)에서 충돌합니다. 코드의 대화 조각 클래스 부분 :DialogFragment 인수 및 nullpointer 예외

public class ConfirmDialog extends DialogFragment { 

public ConfirmDialog() {} 

ConfirmDialog newInstance(String f) { 
    ConfirmDialog d = new ConfirmDialog(); 

    Bundle args = new Bundle(); 
    args.putString("FILE_NAME", f); 
    d.setArguments(args); 

    return d; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    file = getArguments().getString("FILE_NAME"); 
} 

나는이 라인에서 nullpointer 있습니다

file = getArguments().getString("FILE_NAME"); 

을 그리고 난 이유를 모르겠어. 가 나는 또한 코드가 대화 여기

private void showConfirmDialog(String file) { 
    FragmentManager fm = getSupportFragmentManager(); 
    ConfirmDialog dialog = new ConfirmDialog(); 
    Log.i("SHOWFILEACTIVITY", file); 
    dialog.newInstance(file); 
    dialog.show(fm, "fragment_confirm_dialog"); 
} 

"파일"을 호출 붙여 문자열이 null이 아닌, 내가 다음,

Log.i("SHOWFILEACTIVITY", file); 

답변

6

당신은 생성자를 통해 ConfirmDialog을 만들 그것을 확인했습니다 newInstance()을 호출하면 다른 (적절한) ConfirmDialog이 생성됩니다. 그러나 그런 다음 적절한 인스턴스를 삭제합니다.

이 문제를 해결하려면 다음

귀하의 newInstance() 방법은 정적해야합니다 : 그것은 제대로 newInstance() 방법을 사용하므로

public static ConfirmDialog newInstance(String f) { 
    ConfirmDialog d = new ConfirmDialog(); 

    Bundle args = new Bundle(); 
    args.putString("FILE_NAME", f); 
    d.setArguments(args); 

    return d; 
} 

그리고 showConfirmDialog()을 변경해야합니다.

+0

감사합니다. 작동합니다. 나는 newInstance 함수를 사용한 적이 없으며 실수를 범했습니다! 하지만 왜 newInstance는 정적이어야합니까? – giozh

+1

@giozh 우리는 Dialog의 새로운 인스턴스를 만들고 싶기 때문에 Dialog의 * 이미 생성 된 * 인스턴스에 의존하는 것은 나쁜 디자인 접근법입니다. 정적 메서드를 유지하면 종속성이 제거되고 개체 생성이 줄어 듭니다. –