1

为什么我不能在支持包中的 Fragment 中填充 Spinner 的对话框?

由于 UI 设计的要求,我最终在 Fragment 中有子视图。所以结构是这样的:Activity -> 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)
4

0 回答 0