Spinner导致Android应用程序崩溃

4

我正在使用一个下拉框来展示国家ID。一切看起来都很好,直到我运行应用并点击下拉框。当我点击下拉框后,应用程序崩溃。

以下是我的下拉框XML代码(它位于LinearLayout中,如果有用的话):

 <Spinner
       style="@style/mediumBlackDefault"
       android:id="@+id/spinner"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="4" />

以下是我如何填充它的方式:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(  
                       getApplicationContext(),R.array.countries_array,
                       android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

这是countries_array:

<string-array name="countries_array">
    <item>AE</item>
    <item>AF</item>
    <item>AG</item>
    <item>AI</item>
    <item>AL</item>
    <item>AM</item>
</string-array>

最终我收到了这些错误信息:
03-09 11:39:36.944: E/AndroidRuntime(990): FATAL EXCEPTION: main
03-09 11:39:36.944: E/AndroidRuntime(990): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:519)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.app.Dialog.show(Dialog.java:274)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.widget.Spinner$DialogPopup.show(Spinner.java:672)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.widget.Spinner.performClick(Spinner.java:435)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.view.View$PerformClick.run(View.java:13983)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.os.Handler.handleCallback(Handler.java:605)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.os.Looper.loop(Looper.java:137)
03-09 11:39:36.944: E/AndroidRuntime(990):  at android.app.ActivityThread.main(ActivityThread.java:4340)
03-09 11:39:36.944: E/AndroidRuntime(990):  at java.lang.reflect.Method.invokeNative(Native Method)
03-09 11:39:36.944: E/AndroidRuntime(990):  at java.lang.reflect.Method.invoke(Method.java:511)
03-09 11:39:36.944: E/AndroidRuntime(990):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-09 11:39:36.944: E/AndroidRuntime(990):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-09 11:39:36.944: E/AndroidRuntime(990):  at dalvik.system.NativeStart.main(Native Method)

我已阅读所有可用的帖子,但没有解决我的问题。

非常感谢!


感谢所有的回答!我不得不将所有的getApplicationContext()更改为this才能使其工作。 - tcp
3个回答

4
我建议您尝试将YourActivityName.this作为Context传递给您的适配器,而不是使用getApplicationContext()
您正在使用ActivityGroup还是简单的Activity
如果您正在使用ActivityGroup,那么可能会出现糟糕的窗口令牌问题。以下帖子解决了与ActivityGroup有关的问题:

1
谢谢回复。我只需要将所有的getApplicationContext()改为this! - tcp
这个答案对我没用。我在一个选项卡活动组中包含了一个活动,其中有一个旋转器。我该怎么办? - Pramod J George
@PramodJGeorge,你应该尝试使用this.getParent(),可以参考这篇文章: Spinner within Child of ActivityGroup doesn't work 和这篇文章: Error while placing a spinner inside Activity Group - Adil Soomro
@AdilSoomro,感谢您的评论。我在几个小时前找到了这个解决方案。 - Pramod J George

3

由于您的上下文不同,

请使用您的Activity上下文,而不是getApplicationContext()。使用以下引用:

例如:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(  
                       activity.this,R.array.countries_array,
                       android.R.layout.simple_spinner_item);

如果您使用Activity Groups,请提供您的Activity Group的上下文。
例如:
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(  
                       activity.group,R.array.countries_array,
                       android.R.layout.simple_spinner_item);

谢谢回复。我只是不得不将所有的getApplicationContext()更改为this! - tcp

0
使用父活动的上下文而不是当前活动 将代码行更改如下
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(  
                       getParent(), R.array.countries_array,
                       android.R.layout.simple_spinner_item);

你也可以参考这个链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接