2013-05-29 2 views
3

У меня есть проблема при нажатии на блесны (во всплывающем окне)Android Spinner Исключение при нажатии BadTokenException

вот мой Всплывающее:

public class PopupDialog extends PopupWindow { 

    public PopupDialog() { 
     super(); 
     init(); 
    } 

    public PopupDialog(View contentView, int width, int height) { 
     super(contentView, width, height); 
     init(); 
    } 

    public PopupDialog(View contentView) { 
     super(contentView); 
     init(); 
    } 

    private void init() { 
     this.setTouchable(true); 
     this.setFocusable(true); 
     this.setOutsideTouchable(true); 
     setBackgroundDrawable(new BitmapDrawable()); 

     this.setTouchInterceptor(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
        PopupDialog.this.dismiss(); 

        return true; 
       } 

       return false; 
      } 
     }); 

    } 

} 

щелчок кнопки, которая показывает всплывающее окно:

public void click(View v) { 
     LayoutInflater layoutInflater 
     = (LayoutInflater)getBaseContext() 
      .getSystemService(LAYOUT_INFLATER_SERVICE); 
     View popupView = layoutInflater.inflate(R.layout.popup, null); 
       final PopupDialog popupWindow = new PopupDialog(
        popupView, 
        LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT); 

       DisplayMetrics metrics = new DisplayMetrics(); 
       getWindowManager().getDefaultDisplay().getMetrics(metrics); 
       popupWindow.setHeight(metrics.heightPixels); 
       popupWindow.setWidth(300); 

       popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, v.getLeft()+v.getWidth(), 0); 

    } 

у меня есть это исключение (BadTokenException)

05-29 16:35:10.627: E/AndroidRuntime(1055): FATAL EXCEPTION: main 
05-29 16:35:10.627: E/AndroidRuntime(1055): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:515) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.view.Window$LocalWindowManager.addView(Window.java:537) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at android.widget.PopupWindow.invokePopup(PopupWindow.java:988) 
05-29 16:35:10.627: E/AndroidRuntime(1055):  at and 

Любая помощь приветствуется, спасибо заранее :)

+0

вы пробовали после изменения 'LayoutInflater layoutInflater = (LayoutInflater) getBaseContext() .getSystemService (LAYOUT_INFLATER_SERVICE)' в 'LayoutInflater layoutInflater = (LayoutInflater) v.getContext () .getSystemService (LAYOUT_INFLATER_SERVICE); '? –

+0

та же проблема, когда я изменился на LayoutInflater layoutInflater = (LayoutInflater) v.getContext() .getSystemService (LAYOUT_INFLATER_SERVICE); – Simo

ответ

8

Существует конфликт контекста. Попробуйте добавить это в вашем объявлении вращателя XML: android:spinnerMode="dialog"

+0

да, спасибо, он работает нормально в диалоговом режиме, но я должен сделать это в выпадающем режиме, есть ли у вас какие-либо идеи о том, что нужно изменить, чтобы достичь этого в выпадающем режиме? – Simo

+0

По-моему, это невозможно, так как popupWindow берет на себя основное внимание на вашей деятельности. – Mood

+0

Я не знаю, но с количеством попыток и количеством часов, потраченных на его достижение, я уверен, что вы правы, когда говорите, что это невозможно: D спасибо большое. – Simo

0

Выполните тест здесь,

временно удалить эту часть кода

this.setTouchInterceptor(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
        PopupDialog.this.dismiss(); 

        return true; 
       } 

       return false; 
      } 
     }); 

и проверить.

+0

протестирован, такой же проблема. – Simo

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