2012-01-08 9 views
43

Mam następujący błąd podczas wyświetlania PopupWindow. Błędy są wyzwalane przez linię:

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

MapView jest MapView i nic nie jest null. StackTrace:

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) 

Jest to kod z mojej działalności (który rozciąga 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); 
} 

Dziękujemy za dzielenie się swoimi przemyśleniami

Odpowiedz

52

pokazujesz swoje okienko zbyt wcześnie. zamieścić opóźnione przypisanymi showatlocation w Onresume, spróbować

Edycja: Ten post wydaje się mieć ten sam problem odpowiedział Problems creating a Popup Window in Android Activity

+1

To działa. Dziękuję za wskazanie mi właściwego kierunku. – znat

+0

Owww mahn, Świetny sposób myślenia ........................... –

2

rodzic okienko nie może sam być podręczne. Oboje ich rodzice muszą być tacy sami. Jeśli więc utworzysz wyskakujące okienko w wyskakującym okienku, musisz zapisać wyskakujące okno rodzica i uczynić je rodzicem.

oto example

+2

Czy możesz podać nam przykład kodu? – user2224350

9

Istnieją dwa scenariusze, kiedy mogą wystąpić to wyjątek. Jeden wspomina nandeesh. Inny scenariusz wymienione poniżej: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

Upewnij się, że uchwyt oboje

+7

Należy pamiętać, że odradza się udzielanie jedynie linków, odniesienia na ogół z czasem stają się nieaktualne. Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

+0

@TheMan Nice ~ tak mała potężna wskazówka! Dziękuję Ci! – cmcromance

22

sam problem się ze mną, kiedy staramy się pokazać menu podręczne aktywności Dostałam też sam excpetion ale napotykają problemy n rozwiązać poprzez dostarczanie kontekstu ActivityName.this zamiast getApplicationContext() i tak pracował dla mnie może to pomoże komuś

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); 
    } 
} 

poprawny sposób jest popupwindow.show() w onWindowFocusChanged().

1

spróbować pokazać pop jak poniżej

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

spróbować użyć go

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

Czy możesz też opublikować pełny kod, aby upewnić się, że zastępuje poprawne dane. Dziękuję Ci. – kwoxer

Powiązane problemy