DialogFragment: NullPointerException (библиотека поддержки)

Я использую отличную библиотеку ACRA для получения отчетов об ошибках из своих приложений.

Я получаю много отчетов от клиентов о NPE в DialogFragment, но Im не смог воспроизвести его:

java.lang.NullPointerException at android.support.v4.app.DialogFragment.onActivityCreated(SourceFile:366) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:892) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1083) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1065) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(SourceFile:1844) at android.support.v4.app.FragmentActivity.onStart(SourceFile:519) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133) at android.app.Activity.performStart(Activity.java:4475) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1929) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) at android.app.ActivityThread.access$600(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) 

NPE происходит внутри библиотеки поддержки (@line 366):

 353 @Override 354 public void onActivityCreated(Bundle savedInstanceState) { (...) 361 View view = getView(); 362 if (view != null) { 363 if (view.getParent() != null) { 364 throw new IllegalStateException("DialogFragment can not be attached to a container view"); 365 } 366 mDialog.setContentView(view); 367 } 

Im неспособен воспроизвести проблему на любом из моих устройств (от 2.2 до 4.1.1). Поскольку ссылка на какой-либо из моих кодов отсутствует, это ошибка библиотеки?

Solutions Collecting From Web of "DialogFragment: NullPointerException (библиотека поддержки)"

Мне пришлось отлаживать ту же проблему в проекте.

Обычно фрагмент диалога используется ниже

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

Попробуйте обновить его до следующего

 @Override public Dialog onCreateDialog (Bundle savedInstanceState) { //Create custom dialog if (dialog == null) super.setShowsDialog (false); return dialog; } 

Это приведет к тому, что DialogFragment.onAtivityCreated () не выполнит методы для переменной-члена null mDialog.

Это относительно общий сбой, который я видел в StackOverflow, и из-за неправильного создания диалога, в результате чего mDialog будет null. Метод грубой силы, который я первоначально использовал для предотвращения сбоя:

 @Override public void onActivityCreated(Bundle arg0) { if (getDialog() == null ) { // Returns mDialog // Tells DialogFragment to not use the fragment as a dialog, and so won't try to use mDialog setShowsDialog( false ); } super.onActivityCreated(arg0); // Will now complete and not crash 

}

Хотя выше, вероятно, лучше, чем сбой, это не устраняет основную причину того, почему диалог не удалось создать. Для этого может быть много причин, и это то, что нужно отлаживать.

В моей ситуации я обнаружил, что мне нужно реализовать onCreateDialog () вместо диалогового окна onCreateView (), чтобы правильно создать диалог в 100% времени. (OnCreateView () почти всегда работает, чтобы создать диалог, но я ПРЕДОСТАВЛЯл, что есть воспроизводимые угловые случаи, когда onCreateView () не работает, в результате чего mDialog становится нулевым. С другой стороны, я всегда обнаружил, что onCreateDialog () правильно создал DialogFragment's диалог.)

У меня был NPE.

Но окружающий super.OnActivityCreated с try/catch не помог.

Что помогло было удаление статического поля, которое осталось от копирования примера. Таким образом, никаких статических полей внутри переопределенного DialogFragment.

Нет, это не так. Это общая ошибка, если сработает SetContentView. SetContentView вызывает конструкторы элементов управления вашего представления. Один выбрал исключение nullPointerException.