2012-05-13 48 views
1

我正嘗試使用小部件創建應用程序。當用戶將小部件放置在桌面上時,列表視圖應該出現一個項目列表。用戶選擇一個項目,然後使用與該項目相關的相應文本創建小部件。我想我應該通過顯示在服務對話框中做到這一點,但它拋出我服務中的Android錯誤:「無法添加窗口 - 令牌null不適用於應用程序」

產生的原因:android.view.WindowManager $ BadTokenException:無法添加 窗口 - 令牌null不是一個應用程序

to the 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在代碼的其他部分,它就在那裏工作的罰款。我認爲這與該服務有關。

回答

3

您無法在服務中顯示對話框。

如果你真的想顯示對話框。

嘗試啓動一個活動並將活動的主題設置爲Theme.Dialog。

沒有在ApiDemo項目

+0

謝謝,我不知道 – erdomester

2

我知道這個線程已經老了演示,但認爲這將是值得奉獻,無論如何,未來的患者。

儘管大多數人會說不建議直接從服務啓動對話框,但以下解決方法適用於我。使用下面的ServiceDialogBu​​ilder類來構建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(); 
}} 
+0

謝謝,但它更容易顯示系統警告如http://stackoverflow.com/questions/7918571/how-to-display-a-dialog-from-a-service/19269931#19269931 – CoolMind

0

只要確保你的對話框的窗口設置爲SYSTEM_ALERT:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
相關問題