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.
我已经读过其他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();
| 归档时间: |
|
| 查看次数: |
3876 次 |
| 最近记录: |