我有一个从片段调用的PopupWindow,除了我的Spinner,一切都有效.当我点击我的Spinner时它会崩溃并给出错误:
“android.view.WindowManager $BadTokenException:无法添加窗口 – 令牌android.view.ViewRootImpl$W@421a46d8无效;您的活动是否在运行?”
我的代码调用片段中的弹出窗口:
ManagerPopUp mManagerPopUp = new ManagerPopUp(getActivity()); mManagerPopUp.showPopUpAddEvent();
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); return popUp; } }
我的微调适配器:
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,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; } }
查看它在我的应用程序中的显示方式:
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)