wake-up-neo.com

Aktivität hat ein Fenster durchlaufen, das ursprünglich hinzugefügt wurde

Was ist dieser Fehler und warum passiert er?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window [email protected] that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): Android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window [email protected] that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.view.ViewRoot.<init>(ViewRoot.Java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.view.Window$LocalWindowManager.addView(Window.Java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.Dialog.show(Dialog.Java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.Java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.os.AsyncTask.execute(AsyncTask.Java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP.onCreate(viewP.Java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.ActivityThread.access$2200(ActivityThread.Java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.os.Looper.loop(Looper.Java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Android.app.ActivityThread.main(ActivityThread.Java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at Java.lang.reflect.Method.invoke(Method.Java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at dalvik.system.NativeStart.main(Native Method)
1014
Pentium10

Sie versuchen, einen Dialog anzuzeigen, nachdem Sie eine Aktivität beendet haben.

[BEARBEITEN]

Diese Frage ist eine der besten Suchen auf Google für Android-Entwickler.... Daher einige wichtige Punkte aus Kommentaren hinzufügen, die für zukünftige Ermittler hilfreich sein könnten, ohne sich eingehend mit den Kommentaren zu beschäftigen.

Antwort 1

Sie versuchen, einen Dialog anzuzeigen, nachdem Sie eine Aktivität beendet haben.

Antwort 2  

Dieser Fehler kann unter Umständen ein wenig irreführend sein (obwohl die Antwort immer noch völlig genau ist) - d. H. In meinem Fall ein Eine nicht behandelte Ausnahme wurde in eine AsyncTask geworfen, wodurch die .__ verursacht wurde. Aktivität zum Herunterfahren, dann verursachte ein geöffneter Fortschrittsdialog dies Ausnahme ... also die "echte" Ausnahme war etwas früher im Protokoll

Antwort 3  

Rufen Sie in der Dialoginstanz, die Sie erstellt haben, vor dem Beenden Ihres .__-Befehls "deve ()" auf. Aktivität, z. in onPause () oder onDestroy ()

1376
Alex Volovoy

Die Lösung besteht darin, dismiss() für das Dialog aufzurufen, das Sie in viewP.Java:183 erstellt haben, bevor Sie das Activity verlassen, z. in onPause(). Alle Windows & Dialogs sollten vor dem Verlassen eines Activity geschlossen werden.

389
molnarm

Wenn Sie AsyncTask verwenden, kann diese Protokollnachricht möglicherweise trügerisch sein. Wenn Sie in Ihrem Protokoll nachschlagen, finden Sie möglicherweise einen anderen Fehler, wahrscheinlich einen in Ihrer doInBackground()-Methode Ihrer AsyncTask, der Ihre aktuelle Activity in die Luft sprengt, und sobald die AsyncTask zurückkommt, kennen Sie den Rest. Einige andere Benutzer haben das hier schon erklärt :-)

105
ggomeze

Ich habe diesen Fehler ausgelöst, indem ich versehentlich hide() anstelle von dismiss() für eine AlertDialog aufgerufen habe. 

54
Mark Phillip

Sie können diese Ausnahme durch einen einfachen/dummen Fehler erhalten, indem Sie (beispielsweise) versehentlich finish() aufrufen, nachdem Sie eine AlertDialog angezeigt haben, wenn Sie eine break call -Anweisung in einer switch-Anweisung verpassen ...

   @Override
   public void onClick(View v) {
    switch (v.getId()) {
        case R.id.new_button:
            openMyAlertDialog();
            break; <-- If you forget this the finish() method below 
                       will be called while the dialog is showing!
        case R.id.exit_button:
            finish();
            break;
        }
    }

Die finish()-Methode schließt die Activity, aber die AlertDialog wird immer noch angezeigt!

Wenn Sie also intensiv den Code anstarren, nach Problemen mit dem Threading oder nach komplexer Codierung suchen, sollten Sie den Wald für die Bäume nicht aus den Augen verlieren. Manchmal kann es nur so einfach und dumm sein wie eine fehlende break-Anweisung. :)

53

Die Antworten auf diese Frage waren alle richtig, aber ein wenig verwirrend für mich zu verstehen, warum. Nachdem ich ungefähr 2 Stunden herumgespielt hatte, traf mich der Grund für diesen Fehler (in meinem Fall):

Sie wissen bereits aus dem Lesen anderer Antworten, dass das X has leaked window [email protected][] error bedeutet, dass ein Dialogfeld geöffnet war, als Ihre App geschlossen wurde. Aber wieso?

Es könnte sein, dass Ihre App aus einem anderen Grund abgestürzt ist, während Ihr Dialog geöffnet war

Dies führte dazu, dass Ihre App aufgrund eines Fehlers in Ihrem Code geschlossen wurde, der dazu führte, dass das Dialogfeld aufgrund des anderen Fehlers gleichzeitig mit dem Schließen Ihrer App geöffnet blieb.

Sehen Sie sich also Ihre Logik an. Lösen Sie den ersten Fehler und der zweite Fehler löst sich von selbst enter image description here

Ein Fehler verursacht einen anderen, der einen anderen verursacht, wie DOMINOS!

31
Ruchir Baronia

Dieses Problem tritt auf, wenn Sie versuchen, einen Dialog anzuzeigen, nachdem Sie eine Aktivität beendet haben.

Ich habe dieses Problem gerade gelöst, indem ich den folgenden Code aufgeschrieben habe:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

Grundsätzlich, von welcher Klasse Sie progressDialog gestartet haben, überschreiben Sie die onDestroy-Methode und führen Sie diesen Vorgang aus. Es wurde das Problem "Die Aktivität ist durchgesickert" behoben.

30
Shoaib Ahmed

Ich habe kürzlich das gleiche Problem gesehen. 

Der Grund für dieses Problem ist, dass die Aktivität, die vor dem Dialog geschlossen wurde, geschlossen wird. Es gibt verschiedene Gründe dafür. Die oben genannten Beiträge sind auch richtig. 

Ich geriet in eine Situation, weil ich im Thread eine Funktion aufrief, die eine Ausnahme auslöst. Deswegen wurde das Fenster entlassen und damit die Ausnahme.

19
Tushar

Schließen Sie den Dialog ab, wenn die Aktivität zerstört wird

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}
12

Das könnte helfen.

if (! isFinishing()) {

    dialog.show();

    }
11
sandy

Ich hatte die gleiche dunkle Fehlermeldung und hatte keine Ahnung warum. Angesichts von Hinweisen aus den vorherigen Antworten habe ich meine Nicht-GUI-Aufrufe in mDialog.finish () in mDialog.dismiss () geändert und die Fehler verschwunden. Dies hat sich nicht auf das Verhalten meines Widgets ausgewirkt, aber es war verwirrend und hätte möglicherweise einen wichtigen Speicherverlust angezeigt.

11
Melinda Green

Ich habe diese Protokolle in meiner Video-Player-Anwendung erhalten. Diese Meldungen wurden ausgegeben, während der Videoplayer geschlossen wurde. Interessanterweise habe ich diese Protokolle einmal in wenigen Durchläufen zufällig erhalten. Meine Bewerbung beinhaltet auch keine progressdialog. Schließlich bin ich dieses Problem mit der folgenden Implementierung umgangen. 

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

Überschreiben Sie die OnPause mit dem Aufruf von mVideoView.pause() und die Einstellung visibility auf GONE. Auf diese Weise konnte ich das Protokollfehlerproblem "Activity has leaked window" beheben.

11
InvisiblePoint

Ich hatte das gleiche Problem und fand diese Seite, und obwohl meine Situation anders war, rief ich finish von einem if-Block an, bevor er die Alarmbox definierte. 

Also würde das einfache Anrufen von dismiss nicht funktionieren (da es noch nicht gemacht wurde), aber nachdem ich die Antwort von Alex Volovoy gelesen und erkannt habe, dass es die Alarmbox war, die es verursacht hat. Ich habe versucht, eine return-Anweisung direkt nach dem Ende in diesem if-Block einzufügen, und das Problem wurde behoben. 

Ich dachte, als du fertig mit Finish angerufen hast, hat es alles gestoppt und ist genau dort fertig geworden, aber es tut es nicht. Es scheint bis zum Ende des Codeblocks zu gehen, in dem es sich befindet, und endet dann. 

Wenn Sie also eine Situation implementieren möchten, in der es manchmal beendet wird, bevor Sie Code schreiben, müssen Sie direkt nach dem Ende eine return-Anweisung einfügen. Andernfalls wird es weitergehen und sich so verhalten, als würde das Ziel am Ende des Spiels aufgerufen Codeblock nicht dort, wo Sie es aufgerufen haben. Deshalb bekam ich all diese komischen Fehler.

private picked(File aDirectory){
     if(aDirectory.length()==0){
        setResult(RESULT_CANCELED, new Intent()); 
        finish(); 
        return;
    }
     AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
     alert
        .setTitle("Question")
        .setMessage("Do you want to open that file?"+aDirectory.getName());
    alert
        .setPositiveButton("OK", okButtonListener)
        .setNegativeButton("Cancel", cancelButtonListener);
    alert.show();
}

Wenn Sie die Rückgabe nicht direkt nach dem Aufruf von finish dort einfügen, wird es so aussehen, als hätten Sie es nach der alert.show(); aufgerufen, und daher würde das Fenster durchgespielt werden, sobald das Dialogfeld beendet wird, obwohl das Dialogfeld angezeigt wurde Das ist nicht der Fall, es scheint immer noch so zu sein.

Ich dachte, ich würde das hier hinzufügen, da dies zeigt, dass der Befehl zum Fertigstellen anders gehandelt hat, als ich gedacht hatte, und ich denke, es gibt andere Leute, die genauso denken, wie ich, bevor ich das entdeckte.

10
Kit Ramos

Dies ist keine Antwort auf die Frage, aber sie ist relevant für das Thema.

Wenn die Aktivität im Manifest ein Attribut definiert hat

 Android:noHistory="true"

nach der Ausführung von onPause () geht der Aktivitätskontext verloren. Daher kann bei allen Ansichten, die den this - Kontext verwenden, dieser Fehler ausgegeben werden.

7
Killer

Versuchen Sie nicht nur, eine Warnung anzuzeigen, sondern auch, wenn Sie eine bestimmte Instanz einer Aktivität abschließen und versuchen, eine neue Aktivität/einen neuen Dienst zu starten oder zu stoppen.

Beispiel:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
6

Versuchen Sie diesen Code:

public class Sample extends Activity(){
@Override
 public void onCreate(Bundle instance){

}
 @Override
    public void onStop() {
        super.onStop();
      progressdialog.dismiss(); // try this
    }

}
5
tinku

Hatte das Problem, dass ich eine Aktivität beendet habe, als ein Fortschrittsdialog angezeigt wurde.

Blenden Sie also zunächst den Dialog aus und beenden Sie dann die Aktivität. 

5
LeonS

Dies ist mir passiert, wenn ich ProgressDialog in AsyncTask verwende. Eigentlich verwende ich die hide()-Methode in onPostExecute. Basierend auf der Antwort von @Alex Volovoy muss ich dismiss() mit ProgressDialog verwenden, um es in onPostExecute zu entfernen und fertig zu werden.

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it
5
SANAT

Der Fehler "Activity has leaked window that was originally added..." tritt auf, wenn Sie versuchen, eine Warnung anzuzeigen, nachdem Activity tatsächlich finished ist.

Sie haben zwei Möglichkeiten AFAIK:

  1. Überdenken Sie das Login Ihres Alarms: Rufen Sie dismiss() auf der dialog auf, bevor Sie Ihre Aktivität beenden.
  2. Fügen Sie dialog in einen anderen Thread ein und führen Sie es auf diesem thread aus (unabhängig vom aktuellen activity).
5
Kyle Clegg

Dies kann der Fall sein, wenn Sie bei doInBackground() function einen Fehler haben und diesen Code haben.

Versuchen Sie schließlich, einen Dialog hinzuzufügen. Überprüfen Sie zunächst die Funktion doInBackground()

protected void onPreExecute() {
     super.onPreExecute();
     pDialog = new ProgressDialog(CreateAccount.this);
     pDialog.setMessage("Creating Product..");
     pDialog.setIndeterminate(false);
     pDialog.setCancelable(true);
     pDialog.show();

 }

 protected String doInBackground(String...args) {
     ERROR CAN BE IS HERE
 }

 protected void onPostExecute(String file_url) {
     // dismiss the dialog once done
     pDialog.dismiss();
5
NickUnuchek

Im Allgemeinen tritt dieses Problem aufgrund des Fortschrittsdialogfelds auf: Sie können dieses Problem lösen, indem Sie eine der folgenden Methoden in Ihrer Aktivität verwenden:

 // 1):
          @Override
                protected void onPause() {
                    super.onPause();
                    if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
                  {
                        yourProgressDialog.cancel();
                    }
                }

       // 2) :
         @Override
            protected void onDestroy() {
                super.onDestroy();
                if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
               {
                    yourProgressDialog.cancel();
                }
            }
4

Sie müssen ein Progressdialog-Objekt in der onPreExecute-Methode der AsyncTask erstellen, und Sie sollten dismiss für die onPostExecute-Methode. 

4
ammad

Die beste Lösung ist das Hinzufügen eines Dialogs in Try Catch und Dease Dialog, wenn eine Ausnahme auftritt

Verwenden Sie einfach den folgenden Code

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }
3
Ness Tyagi

In meinem Fall lag der Grund darin, dass ich vergessen habe, eine Erlaubnis in die Android-Manifestdatei aufzunehmen.

Wie habe ich es herausgefunden? Genau wie @Bobby in einem Kommentar unter der akzeptierten Antwort sagt, scrollen Sie einfach weiter zu Ihren Protokollen und Sie werden den ersten Grund oder das erste Ereignis sehen, das die Ausnahme wirklich ausgelöst hat. Anscheinend handelt es sich bei der Meldung "Aktivität ist durchgesickertes Fenster, das ursprünglich hinzugefügt wurde" nur um eine Ausnahme, die sich aus dem ergibt, was die erste Ausnahme ist.

3
Matthew Quiros

Versuchen Sie es mit dem folgenden Code. Es funktioniert immer, wenn Sie den Fortschrittsdialog abbrechen, und es wird angezeigt, ob die Instanz verfügbar ist oder nicht.

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
2
Developer

Ausgenommene Fenster haben zwei Gründe:

1) Zeigen des Dialogs, wenn der Aktivitätskontext nicht vorhanden ist. Um dies zu lösen, sollten Sie den Dialog nur anzeigen, wenn Sie sicher sind, dass Aktivität vorhanden ist:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2) den Dialog nicht angemessen abweisen, um diesen Code zu lösen:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}
2
Sherry

Die beste Lösung ist dies vor dem Anzeigen von progressbar oder progressDialog.

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}
2
Ali Akram

Stellen Sie nur sicher, dass Ihre Aktivität nicht unerwartet beendet wird, da im Code einige Ausnahmen auftreten. Im Allgemeinen geschieht dies in einer asynchronen Task, wenn die Aktivität in der doinBackground-Methode erzwungen wird und asynctask zur onPostexecute-Methode zurückkehrt. 

1
Manas Ranjan

Meines Erachtens geht es darum, dass Sie versuchen, einen Dialog aufzurufen, nachdem eine Aktivität abgeschlossen ist. Wenn Sie also mit Handler etwas verzögern, wird Ihr Problem gelöst.

 Handler handler=new Handler();
     handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                     dialog.show();
                     //or
                     dialog.dismiss();

                }
            },100);
1
Satish Silveri
  if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
1
androidmalin

Dieser Fehler wurde angezeigt, wenn versucht wurde, einen Toast aus dem Hintergrund-Thread anzuzeigen .. __ Dieser wurde durch Ausführen des UI-bezogenen Codes im UI-Thread behoben

1
Ron____

Ich habe das gleiche Problem. Der Fehler war nicht in Dialog sondern in einem EditText. Ich habe versucht, den Wert von Edittext innerhalb von Assynctask zu ändern. Der einzige Ausweg, den ich lösen konnte, war das Erstellen einer neuen runnable.

runOnUiThread(new Runnable(){
      @Override
      public void run() {
       ...        
      }
    });  
0
Squilo

Ich habe eine andere Lösung dafür und würde gerne wissen, ob es für Sie gültig erscheint: Anstatt onDestroy abzulehnen, was die führende Lösung zu sein scheint, erweitere ich ProgressDialog ...

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

Dies ist vorzuziehen, AFAIC, weil Sie den Fortschrittsdialog nicht als Mitglied halten müssen, sondern nur feuern (zeigen) und vergessen

0
Kalisky

Stellen Sie sicher, dass Sie .__ anrufen. this.dialog.show. (Aktivität)

0
Kai Lean

Ich stoße auch auf das WindowLeaked-Problem, wenn der Affentest ausgeführt wird.

A[email protected]4334fd40 that was originally added here
Android.view.WindowLeaked: Activity com.myapp.MyActivity has leaked window A[email protected]4334fd40 that was originally added here
            at Android.view.ViewRootImpl.<init>(ViewRootImpl.Java:409)
            at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:312)
            at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:224)
            at Android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.Java:149)
            at Android.view.Window$LocalWindowManager.addView(Window.Java:554)
            at Android.support.v7.app.AppCompatDelegateImplV7.openPanel(AppCompatDelegateImplV7.Java:1150)
            at Android.support.v7.app.AppCompatDelegateImplV7.onKeyUpPanel(AppCompatDelegateImplV7.Java:1469)
            at Android.support.v7.app.AppCompatDelegateImplV7.onKeyUp(AppCompatDelegateImplV7.Java:919)
            at Android.support.v7.app.AppCompatDelegateImplV7.dispatchKeyEvent(AppCompatDelegateImplV7.Java:913)
            at Android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.Java:241)
            at com.Android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.Java:2009)
            at Android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.Java:3929)
            at Android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.Java:3863)
            at Android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.Java:3420)
            at Android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.Java:4528)
            at Android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.Java:4506)
            at Android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.Java:4610)
            at Android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.Java:171)
            at Android.os.MessageQueue.nativePollOnce(Native Method)
            at Android.os.MessageQueue.next(MessageQueue.Java:125)
            at Android.os.Looper.loop(Looper.Java:124)
            at Android.app.ActivityThread.main(ActivityThread.Java:4898)
            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:1008)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:775)
            at dalvik.system.NativeStart.main(Native Method)

Meine Aktivität ist AppCompatActivity. Und ich habe es mit dem folgenden Code in der Aktivität erneuert.

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // added by sunhang : intercept menu key to resove a WindowLeaked error in monkey-test.
    if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}
0
sunhang

Wenn Sie es mit LiveData zu tun haben, versuchen Sie beim Aktualisieren des Werts, anstatt liveData.value = someValue zu verwenden, liveData.postValue(someValue)

0
Mark Pazon

Ich habe einen Dialog `onFehler eines Videoplayers verwendet und statt verrückt zu werden (ich habe alle diese Lösungen getestet)

Ich habe mich für DialogFragmenthttp://developer.Android.com/reference/Android/app/DialogFragment.html entschieden.

Sie können die Erstellung des Builders in einer inneren DialogFragment-Klasse zurückgeben. Überschreiben Sie einfach onCreateDialog.

0
sherpya

Möglicherweise haben Sie findViewById in activity anstelle von dialog.findViewById verwendet und anschließend eine OnClickListener für eine null-Instanz festgelegt, die wahrscheinlich den ursprünglichen Fehler verursacht hat.

0
Deplover

Ich war auch einige Zeit mit diesem Problem konfrontiert, aber mir wurde klar, dass es nicht wegen dialog in meinem Fall wegen ActionMode ist. Wenn Sie also versuchen, die Aktivität zu beenden, wenn eine ActionMode geöffnet ist, wird dies zu diesem Problem führen. Beenden Sie in der onPause Ihrer Aktivität den Aktionsmodus.

 private ActionMode actionMode;

 @Override
 public void onActionModeStarted(ActionMode mode) {
    super.onActionModeStarted(mode);
    actionMode = mode;
 }

 @Override
 protected void onPause() {
    super.onPause();
    if (actionMode != null) actionMode.finish();
 }
0
Praveena