2012-01-08 7 views
43

PopupWindowを表示するときに次のエラーが発生しました。 エラーはラインによってトリガされます。

checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0); 

のMapViewはMapViewので、何がnullではありません。 スタックトレース:

01-08 18:00:09.402: E/AndroidRuntime(27768): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.ViewRootImpl.setView(ViewRootImpl.java:513) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.invokePopup(PopupWindow.java:988) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at com.geoloc.ActivityCheckIn.onCreate(ActivityCheckIn.java:50) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.app.Activity.performCreate(Activity.java:4465) 
01-08 18:00:09.402: E/AndroidRuntime(27768): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 

これは私の活動からのコードである(つまり、MapActivityを拡張)

protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.checkin); 
    mapView = (MapView) findViewById(R.id.mapview); 

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    checkInPopup = new PopupWindow(inflater.inflate(CHECK_IN_POPUP_LAYOUT, null, false)); 
    checkInPopup.setOutsideTouchable(true); 
    checkInPopup.setHeight(100); 
    checkInPopup.setWidth(200); 
    checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0); 
} 

は、あなたがあまりにも早く、あなたのポップアップを表示している自分の考え

答えて

52

を共有していただきありがとうございます。この投稿は、同じ問題がポップアップの親は、それ自体がポップアップすることはできませんProblems creating a Popup Window in Android Activity

+1

にそれを使用してみてください。私に正しい方向を指摘してくれてありがとう。 – znat

+0

オハイオ州マイン、素晴らしい考え方........................... –

2

に答えているようだ :あなたはそれを

編集を試してみて、Onresumeにshowatlocationのために実行可能遅れて投稿すること。両親は同じでなければなりません。したがって、ポップアップ内にポップアップを作成する場合は、親のポップアップを保存して親にする必要があります。

は、ここでは、この例外が発生する可能性がある2つのシナリオがありますexample

+2

コード例を教えてください。 – user2224350

9

です。 1つはnandeeshによって言及される。他のシナリオは、ここで言及されていますhttp://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

は、あなたがそれらの両方を

+7

リンクのみの回答は推奨されず、参照は時間の経過とともに古くなる傾向にあることに注意してください。リンクを参考にして、ここにスタンドアロンの概要を追加することを検討してください。 – kleopatra

+0

@TheMan Nice〜とても小さなチップ!ありがとうございました! – cmcromance

22

同じ問題を扱うことを確認してください、私は活動にポップアップメニューを表示しようとすると、私も同じexcpetionを得たが、私は、問題が発生したn個のコンテキストを提供することで解決する私と一緒に起こりましたActivityName.this代わりgetApplicationContext()とはい、それはそれは

2
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window_layout, new LinearLayout(mContext), true); 
    popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    popupWindow.setContentView(view); 
} 

    @Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    if (hasFocus) { 
     popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0); 
    } 
} 

正しい方法はonWindowFocusChangedでpopupwindow.show()で他の誰かを助けることが私のために働きました()。

1

findViewById(R.id.main_layout).post(new Runnable() { 
     public void run() { 
      mPopupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.CENTER, 0, 0); 
      Button close = (Button) customView.findViewById(R.id.btn_ok); 
      close.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mPopupWindow.dismiss(); 
        doOtherStuff(); 
       } 
      }); 
     } 
    }); 
0

以下のようなポップアップを表示しようとするには、それが動作

LayoutInflater inflater = (LayoutInflater).getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); 
View view = inflate.from(YourActivity.this).inflate(R.layout.yourLayout, null); 
+0

また、正しいコードを置き換えるための完全なコードを投稿することもできますか?ありがとうございました。 – kwoxer

関連する問題