2012-02-07 6 views
0

Я пытаюсь создать OptionsMenu динамически при запуске Activity. В onCreate я называю:openOptionsMenu(); ERROR in onCreate()

openOptionsMenu(); //here i get the error 
closeOptionsMenu(); 

для создания меню, но я получаю следующее сообщение об ошибке:

02-07 12:50:47.183: E/AndroidRuntime(31427): FATAL EXCEPTION: main 
02-07 12:50:47.183: E/AndroidRuntime(31427): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.donauinvest.idealsfa/com.donauinvest.idealsfa.forme.ComenziForm}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1872) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.os.Looper.loop(Looper.java:150) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread.main(ActivityThread.java:4389) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at java.lang.reflect.Method.invokeNative(Native Method) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at java.lang.reflect.Method.invoke(Method.java:507) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at dalvik.system.NativeStart.main(Native Method) 
02-07 12:50:47.183: E/AndroidRuntime(31427): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.view.ViewRoot.setView(ViewRoot.java:562) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:185) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.view.Window$LocalWindowManager.addView(Window.java:433) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:563) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:439) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.Activity.openOptionsMenu(Activity.java:2486) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at com.donauinvest.idealsfa.forme.ComenziForm.onCreate(ComenziForm.java:130) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072) 
02-07 12:50:47.183: E/AndroidRuntime(31427): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836) 
02-07 12:50:47.183: E/AndroidRuntime(31427): ... 11 more 

я создаю меню вроде этого:

android.view.Menu mymenu=null; 
@Override 
public boolean onCreateOptionsMenu(android.view.Menu menu) 
{ 
    menu.clear(); 
    SubMenu opMenu = menu.addSubMenu(0, 0, 0, "Operatii"); 
    int lastindex=0; 
    if (configurare.bChooseTipCda && istoric==0 && (clientid > 0)) 
    { 
     TipComandaClass.setTipComandaContextForDB(this); 
       tc = TipComandaClass.get_TipComanda(); 

     if (tc.size()>0) 
     { 
      for (int i = 0; i < tc.size(); i++) 
      { 
       opMenu.add(0,i,0,tc.get(i).getDenumire()); 
       lastindex=i; 
      } 
      lastindex++; 
      opMenu.add(0,lastindex,0,"NOU"); 
      lastindex++; 
      opMenu.add(0,lastindex,0,"DETALII"); 
     } 
     } 
     if (istoric==1 && configurare.bRetransmitereComanda) 
     {  
      lastindex++; 
      opMenu.add(0,lastindex,0,"RETRANSMITERE"); 
     } 
     if (istoric == 1 && configurare.bInserareComandaIstoric) 
     { 
      lastindex++; 
      opMenu.add(0,lastindex,0,"INSEREAZA"); 
     } 
     mymenu=menu; 

     if (clientid > 0) 
     { 
      for (int i=0;i<mymenu.getItem(0).getSubMenu().size();i++) 
      { 
      if (mymenu.getItem(0).getSubMenu().getItem(i).getTitle().equals("NOU")) 
      { 
        mymenu.getItem(0).getSubMenu().getItem(i).setEnabled(true); 
       break; 
      } 
      } 
     } 
     else 
     { 
      for (int i=0;i<mymenu.getItem(0).getSubMenu().size();i++) 
        { 
         if (mymenu.getItem(0).getSubMenu().getItem(i).getTitle().equals("NOU")) 
         { 
          mymenu.getItem(0).getSubMenu().getItem(i).setEnabled(false); 
          break; 
         } 
        } 
       } 

       if (listCom.size() > 0) 
       { 
       for (int i=0;i<mymenu.getItem(0).getSubMenu().size();i++) 
       { 
        if (mymenu.getItem(0).getSubMenu().getItem(i).getTitle().equals("DETALII")) 
        { 
         mymenu.getItem(0).getSubMenu().getItem(i).setEnabled(true); 
         break; 
        } 
       } 
       } 
       else 
       { 
       for (int i=0;i<mymenu.getItem(0).getSubMenu().size();i++) 
       { 
        if (mymenu.getItem(0).getSubMenu().getItem(i).getTitle().equals("DETALII")) 
        { 
         mymenu.getItem(0).getSubMenu().getItem(i).setEnabled(false); 
         break; 
        } 
       } 
       } 
       if (istoric == 1) 
       { 
        for (int i=0;i<mymenu.getItem(0).getSubMenu().size();i++) 
       { 
        if (mymenu.getItem(0).getSubMenu().getItem(i).getTitle().equals("NOU")) 
        { 
         mymenu.getItem(0).getSubMenu().getItem(i).setEnabled(false); 
         break; 
        } 
       } 
       } 

       if (listCom.size() > 0) 
       { 
        mymenu.setGroupVisible(0, true); 
       } 
       else 
       { 
        mymenu.setGroupVisible(0, false); 
       } 
      super.onCreateOptionsMenu(menu); 
      return true; 
     }//onCreateOptionsMenu 

БЛАГОДАРЯ ADVANCED !

+0

Почему вы называете openOptionsMenu() в OnCreate()? Достаточно переопределить onCreateOptionsMenu() в вашей деятельности, и когда пользователь нажимает кнопку «Меню», ваше меню будет отображаться с элементами, которые вы вставляете в него. Кроме того, вы можете вставить здесь остальную часть своего кода деятельности? – papaiatis

+0

проблема в том, что я должен включать/отключать элементы меню вне onCreateOptionsMenu(). поэтому я использую переменную mymenu. – user1127431

+0

Я попытался использовать this.openOptionsMenu() и ((Activity) this) .openOptionsMenu(), но без везения. У меня есть активность, в которой это работает, но если я пытаюсь сделать то же самое в других действиях, возникает ошибка. – user1127431

ответ

0

Похоже, что openOptionsMenu() в onCreate может вызвать проблемы. Я успешно обойти эту проблему, переместив вызов onResume:

@Override 
protected void onResume() { 
    super.onResume(); 
    openOptionsMenu(); 
} 
Смежные вопросы