我正在尝试使用窗口小部件创建应用程序。当用户将小部件放在桌面上时,列表视图应该提供一个项目列表。用户选择项目,然后使用与该项目相关的相应文本创建窗口小部件。我想我应该通过在服务中显示一个对话框来实现这一目标,但它会让我失望
引起:android.view.WindowManager $ BadTokenException:无法添加 window - 令牌null不适用于应用程序
到dialog_newitem.show();线。为简单起见,我现在使用一个简单的alertdialog。
是这样做的吗?我没有在网上发现任何关于此的事情。
public class UpdateWidgetService extends Service {
private static final String LOG = "de.vogella.android.widget.example";
public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
String value;
Dialog dialog_newitem;
EditText et_newitem;
@Override
public void onStart(Intent intent, int startId) {
Toast.makeText(this, "UpdateWidgetService", Toast.LENGTH_SHORT).show();
dialog_newitem = new Dialog(this); //I tried UpdateWidgetService.this, too
dialog_newitem.setContentView(R.layout.dialog_productlists_grp_capitalized);
dialog_newitem.setTitle("Select");
dialog_newitem.setCancelable(true);
et_newitem = (EditText) dialog_newitem.findViewById(R.id.et_item_name);
Button btn_Save = (Button) dialog_newitem.findViewById(R.id.btn_save_pr);
btn_Save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
value = et_newitem.getText().toString();
}
});
Button btn_Cancel = (Button) dialog_newitem.findViewById(R.id.btn_cancel_pr);
btn_Cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog_newitem.dismiss();
}
});
dialog_newitem.show(); //error
Toast.makeText(this, "value: " + value, Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
我在代码的其他部分使用了这个alertdialog,并且它工作正常。我认为这与服务有关。
答案 0 :(得分:3)
您无法在服务中显示对话框。
如果你真的想要显示一个对话框。
尝试启动一个Activity并将Activity的主题设置为Theme.Dialog。
ApiDemo项目中有一个演示
答案 1 :(得分:2)
我知道这个帖子已经过时了,但我认为无论如何都会为未来的患者做出贡献。
虽然大多数人会说不建议直接从服务启动对话框,但以下解决方法对我有用。使用下面的ServiceDialogBuilder类来构建AlertDialog。与AlertDialog.Builder不同,它可以与Service上下文一起使用,并且可以直接从服务调用show(),而无需启动新活动。
只是要小心这是一个黑客,所以这样做可能会产生一些意想不到的副作用。
希望这有帮助
public class ServiceDialogBuilder extends AlertDialog.Builder {
public ServiceDialogBuilder(Context context) {
super(context);}
@Override
public AlertDialog create() {
AlertDialog dialog=super.create();
//Change dialog window type from TYPE_CHANGED to TYPE_SYSTEM_ALERT
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
return dialog;
}
@Override
public AlertDialog show() {
return super.show();
}}
答案 2 :(得分:0)
只需确保对话框的窗口设置为SYSTEM_ALERT:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);