BadTokenException при заполнении Spinner внутри Fragment - PullRequest
1 голос
/ 29 февраля 2012

Почему я не могу заполнить диалог Spinner внутри Fragment в пакете поддержки?

Из-за требования в дизайне пользовательского интерфейса у меня появилось подпредставление внутри Fragment. Таким образом, структура выглядит так: Действие -> Фрагмент -> (ProfileView, ContactsView) оба расширяют FrameLayout

Все выглядит и работает отлично, кроме Spinner.

Внутри ProfileView У меня есть этот конструктор, который я использую для создания представления. В то же время я взял и контекст и фрагмент, на всякий случай.

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)
...