Error en Spinner en una ventana emergente, se bloquea cuando se hace clic

Tengo un PopupWindow que se llama de un fragmento y todo funciona excepto mi Spinner. Cuando hago clic en mi Spinner se bloquea y da el error:

"Android.view.WindowManager $ BadTokenException: No se puede agregar la ventana – token android.view.ViewRootImpl$W@421a46d8 no es válida, ¿es tu actividad en ejecución?"

Mi código para llamar a la ventana emergente en el fragmento:

ManagerPopUp mManagerPopUp = new ManagerPopUp(getActivity()); mManagerPopUp.showPopUpAddEvent(); 

Mi código en ManagerPopUp para mostrar Popup:

 public class ManagerPopUp { private static final String TAG = "PopUpManager"; private Context mContext; public ManagerPopUp(Context mContext){ this.mContext = mContext; } public PopupWindow showPopUpAddEvent(){ final PopupWindow popUp = new PopupWindow(mContext); LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.popup_add_event, null); //Code for popup event TextView txtRoom, txtTitle, txtEnd, txtStart; ToggleButton tgRepeateWeekly, tgAddReminder; Button btConfirme, btCancel; txtTitle = (TextView)layout.findViewById(R.id.txt_lesson_title_event); txtRoom = (TextView)layout.findViewById(R.id.txt_lesson_room_event); txtStart = (TextView)layout.findViewById(R.id.txt_lesson_start_hour_event); txtEnd = (TextView)layout.findViewById(R.id.txt_lesson_end_hour_event); final Spinner spSelectCalendar = (Spinner)layout.findViewById(R.id.sp_select_calendar); Spinner spSelectReminder = (Spinner)layout.findViewById(R.id.sp_select_reminder_time); tgRepeateWeekly = (ToggleButton)layout.findViewById(R.id.tg_repeate_weekly); tgAddReminder = (ToggleButton)layout.findViewById(R.id.tg_add_reminder); btConfirme = (Button)layout.findViewById(R.id.bt_confirme); btCancel = (Button)layout.findViewById(R.id.bt_cancel); /************************************************************************************************************** * * Initializations * ***************************************************************************************************************/ HandlerCalendarProvider mCalendarProvider = new HandlerCalendarProvider(mContext); final ArrayList<ClassCalendar> mCalendarsList = mCalendarProvider.getAllCalendars(); AdapterCalendarSpinner mAdapterCalendarSpinner = new AdapterCalendarSpinner(mContext, mCalendarsList); spSelectCalendar.setAdapter(mAdapterCalendarSpinner); popUp.setContentView(layout); popUp.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); popUp.setHeight(LinearLayout.LayoutParams.MATCH_PARENT); popUp.setFocusable(true); // Some offset to align the popup a bit to the left, and a bit down, relative to button's position. popUp.setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), BitmapFactory.decodeResource(mContext.getResources(), R.color.color_popup_background))); //PopUpBackground popUp.showAtLocation(layout, Gravity.NO_GRAVITY, 0 , 0); return popUp; } } 

Mi adaptador de spinner:

 public class AdapterCalendarSpinner extends BaseAdapter implements SpinnerAdapter { private Context mContext; private ArrayList<ClassCalendar> mCalendarsList; public AdapterCalendarSpinner(Context mContext, ArrayList<ClassCalendar> mCalendarsList) { this.mContext = mContext; this.mCalendarsList = mCalendarsList; } @Override public int getCount() { return mCalendarsList.size(); } @Override public ClassCalendar getItem(int position) { return mCalendarsList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ClassCalendar o = mCalendarsList.get(position); LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.sp_item_calendar_selected, null); LinearLayout llCalColor = (LinearLayout)convertView.findViewById(R.id.ll_calendar_selected_color); TextView txtCalName = (TextView)convertView.findViewById(R.id.txt_calendar_selected_name); TextView txtCalEmail = (TextView)convertView.findViewById(R.id.txt_calendar_selected_email); llCalColor.setBackgroundColor(o.getCalColor()); txtCalName.setText(o.getCalName()); txtCalEmail.setText(o.getCalEmail()); txtCalName.setTextColor(Color.WHITE); txtCalEmail.setTextColor(Color.WHITE); return convertView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { ClassCalendar o = mCalendarsList.get(position); LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.sp_item_calendar, null); //convertView = LayoutInflater.from(mContext).inflate(R.layout.sp_item_calendar, null); LinearLayout llCalColor = (LinearLayout)convertView.findViewById(R.id.ll_calendar_color); TextView txtCalName = (TextView)convertView.findViewById(R.id.txt_calendar_name); TextView txtCalEmail = (TextView)convertView.findViewById(R.id.txt_calendar_email); llCalColor.setBackgroundColor(o.getCalColor()); txtCalName.setText(o.getCalName()); txtCalEmail.setText(o.getCalEmail()); return convertView; } } 

La vista Cómo aparece en mi aplicación:

Introduzca aquí la descripción de la imagen

Y el error que tengo cuando hago clic en Mi Spinner (Etiqueta roja en la imagen):

 09-19 11:35:23.312: E/AndroidRuntime(2933): FATAL EXCEPTION: main 09-19 11:35:23.312: E/AndroidRuntime(2933): Process: com.loopbug.ritmossegredosgym, PID: 2933 09-19 11:35:23.312: E/AndroidRuntime(2933): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@421a46d8 is not valid; is your activity running? 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.view.ViewRootImpl.setView(ViewRootImpl.java:532) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.widget.PopupWindow.invokePopup(PopupWindow.java:1019) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:925) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.widget.ListPopupWindow.show(ListPopupWindow.java:625) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.widget.Spinner$DropdownPopup.show(Spinner.java:1112) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.widget.Spinner.performClick(Spinner.java:658) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.view.View$PerformClick.run(View.java:18446) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.os.Handler.handleCallback(Handler.java:733) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.os.Handler.dispatchMessage(Handler.java:95) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.os.Looper.loop(Looper.java:136) 09-19 11:35:23.312: E/AndroidRuntime(2933): at android.app.ActivityThread.main(ActivityThread.java:5137) 09-19 11:35:23.312: E/AndroidRuntime(2933): at java.lang.reflect.Method.invokeNative(Native Method) 09-19 11:35:23.312: E/AndroidRuntime(2933): at java.lang.reflect.Method.invoke(Method.java:515) 09-19 11:35:23.312: E/AndroidRuntime(2933): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 09-19 11:35:23.312: E/AndroidRuntime(2933): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) 09-19 11:35:23.312: E/AndroidRuntime(2933): at dalvik.system.NativeStart.main(Native Method) 

 final PopupWindow popUp = new PopupWindow(mContext); 

Compruebe su contexto allí. ¿Es nulo?

Editar: añada esto a su hilandero si muestra el dialogo giratorio

 android:spinnerMode="dialog" 

Si crea un hilador dinámicamente:

 Spinner spinner = new Spinner(context, Spinner.MODE_DIALOG); 

Pase Activity.this En lugar mContext en el constructor de PopupWindow .

Me gusta:

Si Actividad:

 PopupWindow popUp = new PopupWindow(ActivityName.this); 

Si Fragmento:

 PopupWindow popUp = new PopupWindow(getActivity()); 

Editado:

Ahora cambie Constructor con (Activity mcontext)

 Activity mContext; public ManagerPopUp(Activity mContext){ this.mContext = mContext; } 
  • getSelectedItemPosition spinner da resultado incorrecto
  • Problema de estilo al superponer getDropDownView en ArrayAdapter
  • Android- ¿Cómo utilizar Spinner en un AlertDialog?
  • Cómo rellenar Spinner con valor int
  • Spinner no aplica el atributo dropDownSelector
  • ¿Cómo puedo leer el archivo json de la tarjeta SD
  • Combinar Spinner y AutoCompleteTextView
  • AppCompatSpinner vs android.widget.Spinner para la aplicación con min SDK versión 14
  • Botón desplegable de Android
  • Los valores de los hiladores no están ajustados correctamente
  • ¿Qué propiedad controla el fondo desplegable de Spinner?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.