【问题标题】:DialogFragment returning NullPointerDialogFragment 返回 NullPointer
【发布时间】:2015-01-12 00:45:19
【问题描述】:

我正在尝试按照本指南挑选时间:http://developer.android.com/intl/es/guide/topics/ui/controls/pickers.html

但是我收到了这个错误:

01-11 19:37:58.513:E/AndroidRuntime(2419):致命异常:主要 01-11 19:37:58.513: E/AndroidRuntime(2419): java.lang.NullPointerException 01-11 19:37:58.513: E/AndroidRuntime(2419):在 android.app.DialogFragment.show(DialogFragment.java:228) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 iuAndroid.Informe$TimePickerFragment.showTimePickerDialog(Informe.java:126) 01-11 19:37:58.513: E/AndroidRuntime(2419): 在 iuAndroid.Informe$1.onClick(Informe.java:80) 01-11 19:37:58.513: E/AndroidRuntime(2419):在 android.view.View.performClick(View.java:4240) 01-11 19:37:58.513: E/AndroidRuntime(2419):在 android.view.View$PerformClick.run(View.java:17721) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 android.os.Handler.handleCallback(Handler.java:730) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 android.os.Handler.dispatchMessage(Handler.java:92) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 android.os.Looper.loop(Looper.java:137) 01-11 19:37:58.513: E/AndroidRuntime(2419):在 android.app.ActivityThread.main(ActivityThread.java:5103) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 java.lang.reflect.Method.invokeNative(Native Method) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 java.lang.reflect.Method.invoke(Method.java:525) 01-11 19:37:58.513: E/AndroidRuntime(2419):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 01-11 19:37:58.513: E/AndroidRuntime(2419): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-11 19:37:58.513:E/AndroidRuntime(2419):在 dalvik.system.NativeStart.main(Native Method)

我的上课时间选择器:

public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener{

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
    // Use the current time as the default values for the picker
    final Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);

    // Create a new instance of TimePickerDialog and return it
    return new TimePickerDialog(getActivity(), this, hour, minute,
            DateFormat.is24HourFormat(getActivity()));
}

@Override
public void onTimeSet(final TimePicker view, final int hourOfDay, final int minute) {
    // TODO Auto-generated method stub

}

public void showTimePickerDialog(final View v) {
    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(getFragmentManager(), "timePicker");

}

}

当我这样做时:newFragment.show(getFragmentManager(), "timePicker");
它返回一个 NullPointer..

这是我布局的一部分:

<TextView 
    android:id="@+id/from_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/from_name"/>

<Button 
    android:id="@+id/timeFrom"
    android:layout_width="fill_parent"
    android:layout_height="0dip"        
    android:layout_weight="2" 
    android:onClick="showTimePickerDialog"
    style="@android:style/Widget.DeviceDefault.Light.Spinner"
    />
 <TextView 
    android:id="@+id/to_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/to_name"/>

 <Button 
    android:id="@+id/timeTo"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="2"
    android:onClick="showTimePickerDialog"
    style="@android:style/Widget.DeviceDefault.Light.Spinner"
    />

【问题讨论】:

  • 您的iuAndroid.Informe$1.onClick() 中有什么内容?由于您似乎有一个类似工厂的非静态方法showTimePickerDialog()(您不应该),您可能在一个初始化错误的对象上调用它。

标签: java android


【解决方案1】:

.show() 中的 NPE 通常在我们将片段管理器作为 null 传递时抛出。如果在调用 showTimePickerDialog() 时 TimePickerFragment 尚未附加到活动,则您的情况可能会发生这种情况。

我建议您将showTimePickerDialog() 定义为静态,并使用片段管理器作为参数。目前我感觉你在调用这个方法之前先调用new TimePickerFragment(),然后再调用这个方法。所以你要实例化对象两次,这不是必需的。

public static void showTimePickerDialog(final FragmentManager manager) {
    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(manager, "timePicker");
}

然后您可以从您的活动中调用:

TimePickerFragment.showTimePickerDialog(getFragmentManager());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多