2014-01-08 4 views
0

Почему я получаю NPE (диалог возврата null) со следующим?DatePickerDialog NPE

public class ViewCalendar extends DialogFragment implements OnDateSetListener { 
    private Calendar c = Calendar.getInstance(); 
    private DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return dialog; 
    } 
} 

следующее. Зачем?

public class ViewCalendar extends DialogFragment implements OnDateSetListener { 
    private Calendar c = Calendar.getInstance(); 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 
     return dialog; 
    } 
} 
+2

Я думаю, что контекст (это) получал Null. Вам нужно отладить это. –

+2

'getActivity()' is null – Raghunandan

+0

Помимо 'this' write' getActivity(). This' и попробуйте. @Nfear – GrIsHu

ответ

2

В Java (я много о других языках, не знаю), глобальные (экземпляра) будет инициализирован сразу после того, как объект построен (экземпляр создан). поэтому, когда вы объявляете диалог, как поле, как

public class Sampple extends Fragment { 
    private DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 
} 

здесь Dialog будет initialzed после вызова конструктора и до сих пор onAttach() не называется. таким образом, здесь getActivity() возвращает null

+0

Как создать диалог, если календарь еще не был инициализирован? Если вы скажете, что поле будет инициализировано после создания объекта, как это возможно? – Nfear

+0

вы получаете NPE только из-за getActivity(). не имеет значения, как вы объявили Calender как глобальный экземпляр или локальное поле ... –