Leaked Window - Liste von einem Spinner schließen?

  • Antworten:9
next user
  • Forum-Beiträge: 53

20.01.2018, 13:17:03 via Website

Sorry,

muss grad noch eine Frage loswerden. Ich hab in den letzten Stunden nach einer Lösung gesucht, ohne Erfolg.

Es geht um einen Spinner, der soweit funktioniert. Wenn ich jedoch auf den Spinner tippe, sodass sich die Dropdownliste öffnet, mein Handy dann drehe, so bekomme ich den Fehler "leaked Window". Ich habe jetzt auch keine Idee, wie genau ich das verhindern kann. Die geöffnete Liste wird bei Rotation wieder automatisch geöffnet.

Meine Idee wäre, in onDestroy meines Fragments einfach die Dropdownliste zu schließen, nur leider finde ich keine Möglichkeit (Funktion) das zu tun.
Habe lediglich im Netz gefunden, wie ich auf das Öffnen und Schließen als Event reagieren kann, aber selber schließen ... ?

Kann mir da bitte jemand helfen? Vielleicht gibt es da auch eine Routine, das abzufangen, aber ich bin nicht fündig geworden.

Antworten
next user
  • Forum-Beiträge: 53

20.01.2018, 18:37:01 via Website

Pascal P.

Wie sieht denn die Exception (LogCat,rot) aus?
https://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added
Vielleciht hilft das.

Das habe ich auch schon gesehen, allerdings hat es mich nicht weiter gebracht. Es liegt, wie gesagt an der Dropdownliste. Wenn ich das Handy im gleichen Fragment drehe, so ist alles ok.
Nur, wenn ich dabei den Spinner aktiv habe (also Liste offen) und dann drehe, bekomme ich "leaked window". Im Fragment selber passiert dabei aber nichts "sichtbares". Nach der Rotation klappt sich die Liste automatisch wieder auf und ich kann es weiter nutzen.

Die Log schaue ich später mal, wenn ich wieder zuhause bin...

Antworten
next user
  • Forum-Beiträge: 53

21.01.2018, 12:20:50 via Website

Hmmm...

Ich habe mal auch das folgende probiert:
Close Spinner...
Also das mit dem "onDetachedFromWindow()".

Leider ohne Erfolg. Jetzt schließt er zwar bei einer Rotation die Liste (zumindest geht sie nach der Rotation nicht mehr automatisch auf, was mich darauf schließen lässt, das sie "nicht mehr" im offenen Zustand war), aber ich bekomme nachwievor den "leaked window" Fehler.

android.view.WindowLeaked: Activity com.dstyle.gerpad.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{491e500 V.E...... ......ID 0,0-108,464} that was originally added here
at android.view.ViewRootImpl.(ViewRootImpl.java:418)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:1378)
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1234)
at android.widget.ListPopupWindow.show(ListPopupWindow.java:671)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1235)
at android.widget.Spinner.performClick(Spinner.java:770)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:438)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6186)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.01.2018, 13:13:00 via App

Schon mal das Deaktivieren der orientationChanged probiert?:
https://stackoverflow.com/a/2418763

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
next user
  • Forum-Beiträge: 53

21.01.2018, 13:48:56 via Website

Nein.

Wie bereits erwähnt, möchte ich es auch nicht tun. Wegen ein Problem jetzt das ganze anders zu managen halte ich auch für den falschen Weg.
Das ist ja keine Lösung.

Soweit ich es jetzt richtig interpretiert habe, schließt er mit "onDetachedFromWindow()" auch die Liste,
allerdings irgendwie trotzdem "zu spät", sodass leaked window...

Es kann doch nicht sein, das es keine Lösung dafür gibt, die Dropdownliste eines Spinners bei Rotation richtig zu handhaben. Ich meine, das ist doch eine normale Nutzsituation, da muss es doch
logische Abläufe für geben.

Antworten
swa00
  • Forum-Beiträge: 3.704

21.01.2018, 16:14:11 via Website

Hallo next,

ich habe noch nie ein Leaked Windows gehabt, weshalb ich ganz stark davon ausgehe , dass dein
Ablauf nicht stimmt.
Da aber jetzt von uns aus hineinzusteigen, ist verständlicherweise ein Unding.
Ich würde Dir empfehlen , selbst einmal im Auschlußverfahren auszuklammern und der
Sache auf die Spur zu gegen .

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Antworten
next user
  • Forum-Beiträge: 53

21.01.2018, 20:30:38 via Website

swa00

Ich würde Dir empfehlen , selbst einmal im Auschlußverfahren auszuklammern und der
Sache auf die Spur zu gegen .

Da bin ich auch grad dran. Leaked Window kommt bei mir nur bei dieser verd...ten Liste, also wenn sie im offenen Zustand in die Rotation kommt.
Werde morgen intensiver nach dem Ursprung suchen.

Ich nutze ein Fragment in der Activity, in der ich u.a. diesen Spinner habe. Ich habe versucht, die Funktion "onDetachedFromWindow" des CustomSpinner in der onPause() der Activity aufzurufen, jedoch,
wie vermutet ohne Erfolg.
Sehr wahrscheinlich verstehe ich noch nicht ganz, zu welchem Zeitpunkt GENAU es in meinem Fall zum leaked Window kommt, und von welcher Seite ich da ran gehen muss.
Das wird morgen nachgeholt...

Vielen Dank bisher für eure Vorschläge.

Antworten
next user
  • Forum-Beiträge: 53

22.01.2018, 20:47:20 via Website

Irgendwie komme ich nicht weiter.
Ich habe mir gedacht, das irgendwas in meinem Aufbau oder bei dem entsprechendem Fragment falsch ist, deshalb habe ich einfach mal ein neues Projekt erstellt.
Darin befindet sich ein simples Layout (activity_main) und folgendes an Code:

MainActivity:

public class MainActivity extends AppCompatActivity
{
   SpinnerArrayAdapter     gSpinnerAdapter;
   Spinner                 gSpinner;
   String[]                gValues = {"Eintrag 1","Eintrag 2","Eintrag 3"};

   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          gSpinner = (Spinner) findViewById(R.id.mySpinner);
          gSpinnerAdapter = new SpinnerArrayAdapter(this,android.R.layout.simple_spinner_item,gValues);
          gSpinner.setAdapter(gSpinnerAdapter);
   }
}

SpinnerArrayAdapter:

class SpinnerArrayAdapter extends android.widget.ArrayAdapter<String>
{
   SpinnerArrayAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull String[] list)
   {
      super(context, resource, list);
   }

   @NonNull
   @Override
   public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
   {
       return super.getView(position, convertView, parent);
   }

   @Override
   public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
   {
       return super.getDropDownView(position, convertView, parent);
   }
}

Also einfach was komplet simples.
Doch hier das gleiche. Ich tippe auf den Spinner und öffne die Liste, dann dreh ich mein Handy und bekomme den "leaked window" Fehler.
Optisch sehe ich auch hier nichts davon. Das Layout dreht sich einfach und öffnet dann automatisch wieder die Liste.

Weiß grad nicht, wo ich jetzt ansetzen soll...

— geändert am 22.01.2018, 20:52:02

Antworten
next user
  • Forum-Beiträge: 53

24.01.2018, 19:13:22 via Website

Mit den richtigen Stichworten habe ich bei Google jetzt passenderes gefunden.
Auch in den Verlinkungen dort habe ich geschaut, allerdings bin ich nicht weiter gekommen.

Dort hieß es aber auch, das selbst Google-Apps dieses Problem haben. Mir scheint es so, als wäre das
wirklich ein generelles Problem von Android, das noch nicht behoben wurde.

Wo anders habe ich auch gelesen, das die Dropdown-Liste des Spinners im Grunde nur ein PopUp sei. Da dachte ich, ich könnte mit einer Variablen vom Typ "PopupWindow" und der Funktion "getPopupContext" vom Spinner etwas erreichen, aber nein.

Hat sonst noch jemand vielleicht eine Idee?
Wenn nicht, lasse ich es erstmal so und werde später viellecht auf die manuelle Bearbeitung (onConfigurationChanged()) zurückgreifen.

Ist für mich einfach unverständlich, das so ein Fehler noch nicht Lösbar ist, bzw. von Android noch nicht behoben wurde.

Antworten