web-dev-qa-db-ja.com

Androidエラー:ウィンドウを追加できません-トークンnullはアプリケーション用ではありません

やあ警告ダイアログを作成しようとしましたが、アプリケーションを実行すると例外がスローされます

09-26 12:43:21.949: E/AndroidRuntime(14618): FATAL EXCEPTION: main
09-26 12:43:21.949: E/AndroidRuntime(14618): Android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewRootImpl.setView(ViewRootImpl.Java:687)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:301)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:215)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.Java:140)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.app.Dialog.show(Dialog.Java:278)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.example.stampp.UI.Rewards.DeleteRewardsFragment$1.onItemClick(DeleteRewardsFragment.Java:80)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.widget.AdapterView.performItemClick(AdapterView.Java:292)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.widget.AbsListView.performItemClick(AbsListView.Java:1394)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:3024)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.widget.AbsListView.onTouchEvent(AbsListView.Java:3846)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.View.dispatchTouchEvent(View.Java:5629)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1964)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1725)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1970)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1739)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.Android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.Java:2062)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.Android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.Java:1400)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.app.Activity.dispatchTouchEvent(Activity.Java:2369)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.Android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.Java:2010)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.View.dispatchPointerEvent(View.Java:5809)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.Java:3130)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewRootImpl.handleMessage(ViewRootImpl.Java:2658)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewRootImpl.processInputEvents(ViewRootImpl.Java:1015)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.view.ViewRootImpl.handleMessage(ViewRootImpl.Java:2667)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.os.Looper.loop(Looper.Java:137)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Android.app.ActivityThread.main(ActivityThread.Java:4517)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Java.lang.reflect.Method.invokeNative(Native Method)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at Java.lang.reflect.Method.invoke(Method.Java:511)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:993)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:760)
09-26 12:43:21.949: E/AndroidRuntime(14618):    at dalvik.system.NativeStart.main(Native Method)

これは私のコードです:

public class DeleteRewardsFragment extends Fragment{

private Context context;

private FragmentsActivity activity;

private ListView listView;
private View myFragmentView;
private DeleteRewardsAdapter adapter;
private String[] values;

@SuppressLint("ResourceAsColor")
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    myFragmentView = inflater.inflate(R.layout.listview, container, false);
    listView = (ListView) myFragmentView.findViewById(Android.R.id.list);


    activity = (FragmentsActivity) getActivity();
    context = activity.getApplicationContext();

    values = new String[4];

    adapter = new DeleteRewardsAdapter(context, values);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(deleteEvent);

    return myFragmentView;

}

private OnItemClickListener deleteEvent = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        AlertDialog.Builder alertDialog  = new AlertDialog.Builder(context);
        alertDialog .setTitle("Jetzt löschen?");
        alertDialog .setMessage("Die in deisem Store gesammelten stampss gehen debei verloren!")
                .setCancelable(false)
                .setPositiveButton("Abbrechen", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        values = new String[values.length-1];
                        adapter = new DeleteRewardsAdapter(context, values);
                        listView.setAdapter(adapter);
                    }
                })
                .setNegativeButton("Löschen", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        AlertDialog dialog = alertDialog.create();
        dialog.show();

    }
};

}

誰かが私を助けることができますか?

26
user2576008

AlertDialogActivityまたはFragmentに追加するには、コードで実行しているアプリケーションではなく、Activityのインスタンスを使用する必要があります。次のようにAlertDialogを作成します。

AlertDialog.Builder alertDialog  = new AlertDialog.Builder(getActivity());

そして、それはあなたのためのトリックを行う必要があります! :)

49
hardartcore

私の場合、次のようなダイアログを作成しようとしていました。

new Dialog(getApplicationContext());

だから私は変更する必要がありました:

new Dialog(MyActivity.this);

そして、それは働き始めました。

11
Varun Bhatia

以下は、問題を解決するためにできることです。

  1. 代わりに

     _ context _
    使用する必要があります
     _ ActivityName.this _
  2. getApplicationContext()を使用している場合、getApplicationContext()を使用する前に以下のフラグを使用します

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

マニフェストに次のアクセス許可を追加します。

_<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" /> 
_
5
Summved Jain

コンテキストではなく、アクティビティで送信します。

AlertDialog.Builder alertDialog  = new AlertDialog.Builder(activity);
3
kaibuki

私が変更され:

ProgressDialog(getApplicationContext());

に:

ProgressDialog(MainActivity.this);

3
mayur saini

getApplicationContext()を変更しました

activity.this

それが動作します

1
SSKWEB Android