2012-01-08 6 views
43

Ho il seguente errore quando si mostra una finestra popup. Gli errori vengono attivati ​​dalla linea:

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

MapView è un MapView e nulla è nullo. Lo 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) 

Questo è il codice da mia attività (che si estende 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); 
} 

Grazie per aver condiviso i tuoi pensieri

risposta

52

si sta mostrando il vostro popup troppo presto. Si può inviare un eseguibile ritardata per showatlocation in onResume, Fare un tentativo

Edit: Questo post sembra avere lo stesso problema ha risposto Problems creating a Popup Window in Android Activity

+1

Funziona. Grazie per avermi indirizzato nella giusta direzione. – znat

+0

Owww mahn, Ottimo modo di pensare ........................... –

2

genitore di un pop-up non può essere di per sé un popup. Entrambi i genitori devono essere uguali. Quindi, se crei un popup all'interno di un popup, devi salvare il popup del genitore e renderlo genitore.

Ecco un example

+2

Puoi darci un esempio di codice, per favore? – user2224350

9

Ci sono due scenari in cui potrebbe verificarsi questa eccezione. Uno è menzionato da nandeesh. Altro scenario è menzionata qui: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

Assicurarsi di gestire entrambi

+7

Si noti che le risposte di solo collegamento sono scoraggiate, i riferimenti tendono a diventare obsoleti nel tempo. Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

+0

@TheMan Nice ~ un suggerimento così piccolo e potente! Grazie! – cmcromance

22

Lo stesso problema è accaduto con me quando si tenta di visualizzare il menu a comparsa in attività Ho anche avuto lo stesso excpetion ma ho incontrato problema n risolvere fornendo contesto ActivityName.this invece di getApplicationContext() e sì ha funzionato per me potrebbe aiuterà qualcun altro

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

il modo corretto è popupwindow.show() in onWindowFocusChanged().

1

cercano di mostrare pop come qui di seguito

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

tenta di utilizzarlo

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

Potresti forse anche pubblicare il codice completo per assicurarti che stia sostituendo il materiale corretto. Grazie. – kwoxer

Problemi correlati