【问题标题】:DatePickerDialog NPEDatePickerDialog NPE
【发布时间】:2014-01-08 19:22:30
【问题描述】:

为什么我会得到一个带有以下内容的 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;
    }
}

【问题讨论】:

  • 我认为上下文(this)越来越空。你需要调试它。
  • getActivity() 为空
  • 除了thisgetActivity().this 并尝试。 @Nfear
  • @Nfear 你可以看看这个developer.android.com/reference/android/app/…。你会认识你自己。 this 指的是ViewCalendar,其中`implements OnDateSetListener。因此this 是第二个参数。 getActivity 为空
  • @Nfear 不需要。 getActivity 返回承载此片段的活动

标签: android


【解决方案1】:

在Java中(我对其他语言不太了解),全局(实例)字段将在对象被构造(创建实例)后立即初始化。因此,当您将 Dialog 声明为

之类的字段时
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 将在构造函数调用之后被初始化,但onAttach() 仍然没有被调用。因此这里getActivity() 返回null

【讨论】:

  • 如果Calendar还没有初始化,如何构建对话框?如果你说创建对象后会初始化字段,这怎么可能?
  • 您获得 NPE 只是因为 getActivity()。无论您如何将 Calender 声明为全局实例或本地字段...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多