サポート パッケージの 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 である 2 つを除く)。
this.context
this.parent
this.parent.getActivity()
this.parent.getActivity().getParent() // NULL
this.parent.getSupportActivity()
this.parent.getSupportActivity().getParent() // NULL
parent.getSupportActivity().getApplicationContext()
画面は正常に動作し、コンテキスト リソースから XML を読み込むこともできます。では、なぜスピナーが機能しないのでしょうか?
以下のスタック トレースは、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)