2014-12-21 2 views
1

Я пытаюсь создать экземпляр диалога в своей деятельности.NPE при создании экземпляра диалогового окна

public void createOptionsMenu() { 
    Log.e("ActivityContext null?","" + myActivity.this); 
    myOptionsDialog = new Dialog(myActivity.this); //throwsNPE 
    myOptionsDialog.setContentView(R.layout.options_dialog); 
    myOptionsDialog.show(); 
} 

Благодаря Log.e, которые вы можете видеть выше, я знаю, что мой activity-context не равно нулю!

12-21 15:17:15.466: E/ActivityContext null?(3774): [email protected] 
12-21 15:17:15.469: E/AndroidRuntime(3774): java.lang.NullPointerException 

Я думаю проблема в том, что я называю createOptionsMenu() из другого класса, который имеет только ApplicationContext от myActivity. Если да, как я могу создать свой диалог, не передавая ActivityContext другому классу, который вызывает createOptionsMenu.

Любая помощь приветствуется.

Update:

12-21 15:17:15.469: E/AndroidRuntime(3774): FATAL EXCEPTION: main 12-21 15:17:15.469: E/AndroidRuntime(3774): java.lang.NullPointerException 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:140) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.app.Dialog.<init>(Dialog.java:154) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.app.Dialog.<init>(Dialog.java:131) 12-21 15:17:15.469: E/AndroidRuntime(3774): at com.android.myproject.myActivity.createOptionsMenu(myActivity.java:798) 12-21 15:17:15.469: E/AndroidRuntime(3774): at com.android.myproject.WorkerClass$2.onItemLongClick(WorkerClass.java:448) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.widget.AbsListView.performLongPress(AbsListView.java:2883) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2833) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.os.Handler.handleCallback(Handler.java:725) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.os.Handler.dispatchMessage(Handler.java:92) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.os.Looper.loop(Looper.java:153) 12-21 15:17:15.469: E/AndroidRuntime(3774): at android.app.ActivityThread.main(ActivityThread.java:5338) 12-21 15:17:15.469: E/AndroidRuntime(3774): at java.lang.reflect.Method.invokeNative(Native Method) 12-21 15:17:15.469: E/AndroidRuntime(3774): at java.lang.reflect.Method.invoke(Method.java:511) 12-21 15:17:15.469: E/AndroidRuntime(3774): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 12-21 15:17:15.469: E/AndroidRuntime(3774): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 12-21 15:17:15.469: E/AndroidRuntime(3774): at dalvik.system.NativeStart.main(Native Method)

Instantiate активность:

myActivity myActivity_ = new myActivity(); 
       WeakReference<myActivity> myWeakActivity = new WeakReference<myActivity>(myActivity_); 
       myWeakActivity.get().createOptionsMenu(); 
+0

Опубликовать исключение stacktrace и как вы инициализируете 'myActivity'. – laalto

+0

@laalto Я обновил свой вопрос. Что значит инициализация? myActivity? Это моя «MainActivity». Я относительно новичок в Android, поэтому я не уверен, что вы имеете в виду. – MMike

+0

Я имею в виду, как переменная 'myActivity' получает значение и откуда. Из stacktrace очевидно, что вы создаете свою деятельность с помощью 'new', чего вы никогда не должны делать. – laalto

ответ

0

Проблема была Context. Когда я создал новый объект моей деятельности, старая активность недействительна «внутри» нового объекта.

soltuion было просто передать Activity-Context в createOptionsMenu, а затем сделать это:

MyActivity myActivity_ = (MyActivity) context; 

Тогда у вас есть ссылки на ресурсы, которые вы действительно хотите.

Надеюсь, это поможет кому-то.

Смежные вопросы