2012-05-13 6 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

サービスにダイアログを表示することはできません。

本当にダイアログを表示したい場合は、

アクティビティを開始し、アクティビティのテーマをテーマに設定してください。

私はこのスレッドが古いですけど、それは将来の患者のために、とにかく貢献する価値があるだろうと思ったApiDemoプロジェクト

+0

おかげで、私はその – erdomester

2

でデモがあります。

ほとんどの場合、サービスから直接ダイアログを起動することは推奨されませんが、次の回避策が有効です。以下のServiceDialogBu​​ilderクラスを使用してAlertDialogを構築します。 AlertDialog.Builderとは異なり、これはサービスコンテキストで動作し、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); 
関連する問題