我在整个互联网上都看过了,我很清楚 stackOverflow 中关于这个主题的线程,但没有一个对我有帮助。
在我的应用程序中,我使用 Standout 开源库来启用非全屏窗口,基本上它所做的是创建框架布局并用
WindowManager.addView(View view, LayoutParams params)
在 FrameLayout 中,我有 Spinner View 来显示下拉列表。 当我启动应用程序时一切正常,我可以看到 FrameLayout 和微调器, 但是当我触摸微调器时,应用程序崩溃并出现错误:“无法添加窗口—— token null 不适用于应用程序”
我没有使用 getApplicationContext() 的任何代码行,尽管 Standout 库有,但我将它们更改为指向“this”但它仍然崩溃。
谁能帮帮我?
编辑:它只发生在 2.3.5 设备上(据我检查),在 4.1 上工作正常
最佳答案
这是因为 Standout 窗口不是 Activity 。它只是一个 AlertWindow 类型。单击 Spinner 将尝试显示一个对话框,该对话框假定从 Activity 启动。但事实并非如此。然后应用程序崩溃发生。要解决此问题,您必须扩展微调器以显示 ListView 对话框,就像用户单击微调器时显示的微调器一样。 试试下面的代码来显示非 Activity 类的对话框:
public class MySpinner extends Spinner {
@Override
public boolean performClick() {
// the spinner click is handled here
selectedPosition = getSelectedItemPosition();
Dialog dialog = getDialog();
Window window = dialog.getWindow();
window.getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
dialog.show();
}
return true;
}
private Dialog getDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View dialogView = inflate(getContext(),R.layout.spin_dialog, null);
builder.setView(dialogView);
// show the Spinner array list in a listview
ListView listview = (ListView) dialog.findViewById(R.id.spin_list);
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listview.setOnItemClickListener(this);
ArrayAdapter adapter = new ArrayAdapter(getContext(), R.layout.list_item, spinner_array_list);
// here is your spin adapter
listview.setAdapter(adapter);
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
AlertDialog dialog = catBuilder.create();
return dialog;
}
}
关于android - StandOutWindow Spinner 无法添加窗口 -- 标记为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12620784/