为什么我不能在支持包中的Fragment中填充Spinner的对话框?
由于UI设计的要求,我最终在Fragment中有子视图。所以结构如下: 活动 - >片段 - > (ProfileView,ContactsView)都扩展了FrameLayout
除了Spinner,一切看起来都很好。
在ProfileView中我有这个用于创建视图的构造函数。与此同时,我同时采用了Context和Fragment。
public ProfileView(Context context, Fragment parent) {
super(context);
this.context = context;
this.parent = parent;
}
初始化视图时我有
List<LanguageVO> languageList = XMLResourceManager.GetLanguagesList(this.context.getResources()); // Load resource from XML
spnLanguage = (Spinner) view.findViewById(R.id.spnLanguage);
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(this.parent.getSupportActivity().getApplicationContext(), android.R.layout.simple_spinner_item, languageList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnLanguage.setAdapter(adapter);
我尝试将所有这些传递给Adapter for Context,但它们都不起作用。所有这些都导致BadTokenException(除了两个开头为NULL)。
this.context
this.parent
this.parent.getActivity()
this.parent.getActivity().getParent() // NULL
this.parent.getSupportActivity()
this.parent.getSupportActivity().getParent() // NULL
parent.getSupportActivity().getApplicationContext()
屏幕工作正常,我甚至可以从上下文资源加载XML。那么为什么Spinner不起作用?
我应该补充一下,下面的堆栈跟踪是在2.2 / 2.3设备上运行的。该代码在ICS上运行良好。
堆栈追踪:
02-29 03:18:35.675: E/AndroidRuntime(4165): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.view.ViewRoot.setView(ViewRoot.java:539)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:203)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:117)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.app.Dialog.show(Dialog.java:241)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.widget.Spinner.performClick(Spinner.java:261)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.view.View$PerformClick.run(View.java:9152)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.os.Handler.handleCallback(Handler.java:587)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.os.Handler.dispatchMessage(Handler.java:92)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.os.Looper.loop(Looper.java:123)
02-29 03:18:35.675: E/AndroidRuntime(4165): at android.app.ActivityThread.main(ActivityThread.java:3691)
02-29 03:18:35.675: E/AndroidRuntime(4165): at java.lang.reflect.Method.invokeNative(Native Method)
02-29 03:18:35.675: E/AndroidRuntime(4165): at java.lang.reflect.Method.invoke(Method.java:507)
02-29 03:18:35.675: E/AndroidRuntime(4165): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
02-29 03:18:35.675: E/AndroidRuntime(4165): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
02-29 03:18:35.675: E/AndroidRuntime(4165): at dalvik.system.NativeStart.main(Native Method)