【问题标题】:Android error in service: "Unable to add window -- token null is not for an application"服务中的 Android 错误:“无法添加窗口 - 令牌 null 不适用于应用程序”
【发布时间】:2012-05-13 09:00:39
【问题描述】:

我正在尝试使用小部件创建应用程序。当用户将小部件放在桌面上时,列表视图应该会显示一个项目列表。用户选择一个项目,然后使用与该项目相关的相应文本创建小部件。我认为我应该通过在服务中显示一个对话框来做到这一点,但它抛出了我

原因:android.view.WindowManager$BadTokenException: 无法添加 window -- token null 不适用于应用程序

到 dialog_newitem.show();线。为简单起见,我现在使用一个简单的警报对话框。

这是这样做的方法吗?我在网上没有找到任何关于此的内容。

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;
    }
}

我在代码的其他部分中使用了这个警报对话框,它工作正常。我认为这与服务有关。

【问题讨论】:

    标签: android widget


    【解决方案1】:

    您不能在服务中显示对话框。

    如果你真的想显示一个对话框。

    尝试启动一个 Activity 并将 Activity 的 Theme 设置为 Theme.Dialog。

    The ApiDemo 项目中有一个演示

    【讨论】:

      【解决方案2】:

      我知道这个帖子已经过时了,但我认为无论如何都值得为未来的患者做出贡献。

      虽然大多数人会说不建议直接从服务启动对话框,但以下解决方法对我有用。使用下面的 ServiceDialogBu​​ilder 类来构建您的 AlertDialog。与 AlertDialog.Builder 不同,这将与服务上下文一起使用,并且可以直接从服务调用 show(),而无需启动新活动。

      请注意,这有点像 hack,所以这样做很可能会产生一些意想不到的副作用。

      希望对你有帮助

      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();
      }}
      

      【讨论】:

      【解决方案3】:

      只需确保您的对话框窗口设置为 SYSTEM_ALERT:

      dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2019-01-04
        • 2011-12-17
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        相关资源
        最近更新 更多