1

ウィジェットでアプリケーションを作成しようとしています。ユーザーがウィジェットをデスクトップに配置すると、リストビューにアイテムのリストが表示されます。ユーザーがアイテムを選択すると、そのアイテムに関連するそれぞれのテキストでウィジェットが作成されます。サービスでダイアログを表示することでこれを行うべきだと思いましたが、スローされます

原因: android.view.WindowManager$BadTokenException: ウィンドウを追加できません -- トークン 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;
    }
}

コードの他の部分でこのアラートダイアログを使用しましたが、正常に動作しています。サービスの関係だと思います。

4

3 に答える 3

3

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

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

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

The ApiDemo Project にデモがあります

于 2012-05-13T09:02:39.107 に答える
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();
}}
于 2014-01-03T04:29:36.467 に答える