选择Android Spinner会导致WindowManager $ BadTokenException

Mic*_*ael 1 android exception spinner

我创建了一个自定义AlertDialog来显示Spinner和一些EditText元素.当我选择菜单选项时,会启动此自定义AlertDialog.一切正常,直到我实际选择微调器来尝试选择一个项目,此时我得到了BadTokenException.我已经读过其他StackOverflow帖子,说类似的异常是尝试使用getApplicationContext()而不是传递Activity.this来显示diaglog的结果.我没有明确地将getApplicationContext()传递给与此AlertDialog相关的任何内容.

为了设置这个自定义AlertDiaglog,我创建了一个包含Spinner和EditText元素的布局文件,然后使AlertDialog使用该布局:

LayoutInflater inflater = (LayoutInflater)getApplication().getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_layout, (ViewGroup)findViewById(R.id.custom_layout_root));
spinner = (Spinner)layout.findViewById(R.id.custom_layout_spinner);
ArrayAdapter adap = ArrayAdapter.createFromResource(Activity.this, R.array.data, android.R.layout.simple_spinner_item);
adap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adap);
spinner.setOnItemSelectedListener(new SpinnerItemListener());

AlertDialog.Builder dialog = new AlertDialog.Builder(Activity.this);
dialog.setTitle("Title");
dialog.setPositiveButton("Ok", new Dialog.OnClickListener() ...
...
dialog.show();
Run Code Online (Sandbox Code Playgroud)

此代码都可以正常显示AlertDialog.但是,当我实际触摸Spinner时,我遇到以下问题:

Thread [<3> main] (Suspended (exception WindowManager$BadTokenException)) 
ViewRoot.handleMessage(Message) line: 1704
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4203
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 791
ZygoteInit.main(String[]) line: 549
NativeStart.main(String[]) line: not available [native method]
Run Code Online (Sandbox Code Playgroud)

有没有人知道发生了什么?异常消息说:

Unable to add window -- token null is not for an application
Run Code Online (Sandbox Code Playgroud)

我相信这是其他人已经看到的这类问题的消息,所以我假设ApplicationContext在混合中的某个地方,但我不知道在哪里.我的清单设置为minSdk为1.5,目标SDK为1.6.

Chr*_*Orr 8

我已经读过其他StackOverflow帖子,说类似的异常是尝试使用getApplicationContext()而不是传递Activity.this来显示diaglog的结果.
我没有明确地将getApplicationContext()传递给与此AlertDialog相关的任何内容.

据推测,这行代码实际上就是这样 - 你要求Application使用它的上下文来访问服务,而不是当前的服务Window:

LayoutInflater inflater = 
  (LayoutInflater) getApplication().getSystemService(LAYOUT_INFLATER_SERVICE);
Run Code Online (Sandbox Code Playgroud)

难道你不能用下面的版本替换它,因为你是AlertDialog从一个Activity

LayoutInflater inflater =
  (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

LayoutInflater inflater = getLayoutInflater();