2

Androidアプリにスピナーがあり、それを表示できますが、秒です。クリックすると、アプリがクラッシュしてスローされます:

ウィンドウを追加できません -- トークン android.view.ViewRootImpl$Wfb@ が無効です: アクティビティは実行されていますか?

レイアウトはシンプルです。リストとリストに何かを追加するためのボタンを持つアクティビティがあります。追加ボタンをクリックすると、スピナー、テキスト ボックス、およびボタンを表示するポップアップ ウィンドウが開きます。スピナーをクリックするまで、すべて正常に動作します。

今、私はグーグルを1時間検索し、これらを見つけました:

Android - スピナーに値を動的に追加する

BadTokenException PopUpWindow にウィンドウ スピナーを追加できません

Android Spinner エラー: android.view.WindowManager$BadTokenException: ウィンドウを追加できません

もっと。それらはすべてコンテキストを指しているように見えますが、「this」の使用から getApplicationContext まで、私の activity.context の名前まですべてを試しましたが、どれも機能しません。contentView をページに設定するだけでなく、誰かが提供した回答を 2 回使用してみましたが、事態は悪化しました (アプリはすぐに null ポインター例外でクラッシュしました)。

ポップアップウィンドウのコードは次のとおりです(「追加」ボタンがクリックされたときに実行されます):

public void add_itinerary_clicked(View view)
{
    LayoutInflater i = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = i.inflate(R.layout.itinerary_add_item_page, null);
    popup = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    popup.showAtLocation(popupView , Gravity.CENTER, 0, 0);
    Spinner airlineChoice = (Spinner) popupView.findViewById(R.id.airlineSpinner);
    Button addBtn= (Button) popupView.findViewById(R.id.finish_addItinerary);

    String[] list = new String[1];
    list = airlineMap.keySet().toArray(list);

    ArrayAdapter<CharSequence> spinnerAdapter = new ArrayAdapter<CharSequence>(getApplicationContext(), android.R.layout.simple_spinner_item, list );
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
    airlineChoice.setAdapter(spinnerAdapter);


    addBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish_addItinerary_clicked();
            popup.dismiss();
        }
    });
}

この時点で私は完全に途方に暮れています。それが文脈ではない場合(他の人が言ったことを試しました)、それは何ですか?

完全なエラー メッセージは次のとおりです。

FATAL EXCEPTION: main
 android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@40de1700 is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
    at android.widget.PopupWindow.invokePopup(PopupWindow.java:993)
    at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:899)
    at android.widget.ListPopupWindow.show(ListPopupWindow.java:603)
    at android.widget.Spinner$DropdownPopup.show(Spinner.java:981)
    at android.widget.Spinner.performClick(Spinner.java:609)
    at android.view.View$PerformClick.run(View.java:17355)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

3
  1. アプリケーション コンテキストではなく、アクティビティ コンテキストを使用する必要があると思います。
  2. ポップアップではなくダイアログを使用します。簡単で、維持するコードが少なく、Google によると標準です。
  3. スピナーにはある種のクリックリスナーが必要だと思います。
于 2013-07-19T00:23:48.977 に答える
1

アプリケーション/ベース コンテキストではなく、アクティビティ コンテキストを使用することをお試しください。これは状況を助けるかもしれません。

于 2013-07-19T00:14:18.863 に答える