我已经浏览了整个互联网,我很清楚stackOverflow中关于这个主题的线程,但是他们没有帮助我。
在我的应用程序中我使用Standout开源库来启用非全屏幕窗口,基本上它的作用是创建帧布局并用
显示它WindowManager.addView(View view, LayoutParams params)
在FrameLayout内部我有Spinner视图来显示下拉列表。 当我启动应用程序时它的工作正常,我可以看到FrameLayout和微调器, 但当我触摸微调器时,应用程序崩溃并出现错误:“无法添加窗口 - 令牌null不适用于应用程序”
我没有使用getApplicationContext()的任何代码行,虽然Standout库有,但我将它们更改为指向'this'并且它仍然崩溃。
任何人都可以帮助我吗?
编辑:它只发生在2.3.5设备上(从我检查的内容),在4.1上工作正常
答案 0 :(得分:1)
这是因为Standout窗口不是活动。它只是一个AlertWindow类型。单击Spinner将尝试显示一个假定从活动启动的对话框。但事实并非如此。然后发生应用崩溃。要解决此问题,您必须扩展Spinner以显示列表视图对话框,如用户单击Spinner时显示的微调器。 尝试以下代码来显示非活动类的对话框:
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;
}
}
答案 1 :(得分:1)
我遇到了同样的问题。解决方案相当简单。您只需添加布局XML文件:
android:spinnerMode="dropdown"
所以你的spinner元素看起来像这样:
<Spinner
android:id="@+id/spLists"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:spinnerMode="dropdown" />