Illegal State Exception - ViewPager

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

29.06.2014, 19:38:11 via Website

Hallo,
Ich habe einen ViewPager der mir verschiedene Fragments anzeigt, dieser befindet sich in einer 2. Activity die per inent geöffnet wird.
Sobald ich aber ber Back Button aus dierer Herausgehe, wird mir eine IllegalState Exception geworfen.

E/AndroidRuntime(1855): FATAL EXCEPTION: main
E/AndroidRuntime(1855): java.lang.IllegalStateException: Observer android.support.v4.view.PagerTitleStrip$PageListener@a6b1f248 was not registered.

Weiss jemand was es mit diesem PageListener auf sich hat und warum dierer nicht regisitiert ist?
Code:

 SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());  

               // Set up the ViewPager with the sections adapter.  
               mViewPager = (ViewPager) findViewById(R.id.pager);  
                 mViewPager.setAdapter(mSectionsPagerAdapter);  
//Die Klasse SeconsPagerAdapter implementiert FragmentPagerAdapter und überschreibt getItem,getCount und getPageTitle

Vielen Dank
Pascal

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

Antworten
Markus B.
  • Forum-Beiträge: 636

29.06.2014, 19:44:10 via Website

Hi,
du musst

SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

mit

SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());

ersetzten.

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

29.06.2014, 19:47:56 via Website

Dies Funktioniert leider nicht, da getChildFragmentManager nicht als gültige Methode erkannt wird
Meine Klasse (Activity) erbt von einer FragmentActivity, muss ich dies ändern?

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

Antworten
Markus B.
  • Forum-Beiträge: 636

29.06.2014, 19:52:27 via Website

Args, das habe ich mich verlesen.
Schau mal alle Fragments durch, welche dar ViewPager anzeigt. Ich wette dort steht getSupportFragmentManager() und du musst es mit dem getChildFragmentManager() tauschen.

— geändert am 29.06.2014, 19:52:44

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

29.06.2014, 19:56:06 via Website

Ich verstehe nicht was du meinst, mein Fragment Klasse erbt von Fragment (ist klar)
Aber innerhalb der Klasse wird nirgendwo Bezug auf den Viewpager genommen.
Alles was Programmößig zum Viewpager gehört habe ich gepostet, bis auf den FragmentPagerAdapter.
Könnte es an disem liegen?

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

Antworten
Markus B.
  • Forum-Beiträge: 636

29.06.2014, 20:09:14 via Website

Also ich hatte mal das gleiche Problem:
Das lag daran das ich durch den ViewPager NestedFragments genutzt habe. Also ein Fragment in einem Fragment. Dann musst du im NestedFragment den ChildFragmentManager nutzten, damit du das Fragment einen privaten Manager bekommst.

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

29.06.2014, 20:18:12 via App

Sowas habe ich nicht.
Aber trotzdem danke.
Werde morgen nochmal danach suchen.

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

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

30.06.2014, 19:14:33 via Website

So habe jetzt den Übeltäter aufsüren können, das Problem ist aber noch nicht behoben.
Es war ein AsyncTask der im FragmentCode ausgeführ wird ( per AsyncTast#execute mit zugehörigem interface Callback)
Komischerwise wurde dies mir im LogCat garnicht als Fehler eingezeigt.
Kann ich das jetzt irgendwie beheben, ohne dass der ""FragmentThread" hängt.
Denn RunInUiThread funktioniert irgend wie nicht

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

Antworten
Andreas S.
  • Forum-Beiträge: 76

01.07.2014, 01:39:01 via App

Nun ich nehme an, dass dein Callback nicht mehr gültig ist, wenn der AsyncTask abgeschlossen ist?

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

01.07.2014, 04:07:09 via App

Doch der Callback ist gültig und wird auch ausgeführt etc.

Das Problem Tritt ja erst nach drücken des Back buttons aus nachdem Android zu zuletzt geöffneten Activity springt.
Ohne asynctask bzw. laden im mainthread (test) entsteht diese exception nicht.
Was hat ein AsyncTask denn mit der Activity zu tun?
Natürlich kann ich auch einfach den Back button überschreiben sodass dieser ignoriert wird, das wäre aber nur eine Vorübergehende lösung.

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

Antworten
Andreas S.
  • Forum-Beiträge: 76

01.07.2014, 08:52:45 via App

Also während der asynctask ausgeführt wird drückst du den back button und dann wird die exception geworfen?

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

01.07.2014, 13:09:24 via App

Nein der AsyncTask läuft ganz normal drch.
Wenn der fertig ist -> callback
Dann kann ich alle fragments im pager ganz normal nutzen.
Wenn ich irgendwann den back buton drücke komme ich zurück zur letzen activity ( ohne fragments und pager)
und dann wir während dem wechsel die oben genante exception geworfen.
Komisch finde ich dass es ohne async task richtig funktioniert.

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

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

01.07.2014, 16:34:10 via Website

Habe den Fehler selber gefunden.
Es lag nicht dan der Fragment Logik vielmehr an meinem AsyncTask, der mein Callback zwar ausführte, aber nich im Mainthread.
Alle anderen Activities die diesen Task benutzen, hat dies wohl nicht interessiert.
Der Callback wird nun im mainthread aufgerufen.
Aufjeden Fall fliegt jetzt keine Exception mehr :)
Danke für die Hilfe!

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

Antworten
Andreas S.
  • Forum-Beiträge: 76

01.07.2014, 18:34:14 via App

dafür hat der asynctask ja die Methode onPostExecute.

onPreExecute - UI Thread
doInBackground - Neuer Thread
onPostExecute - UI Thread

— geändert am 01.07.2014, 18:35:12

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

01.07.2014, 18:36:41 via Website

Das weiss ich ja, habe ich nur beim Programmieren des Callbacks vergessen, dass ich den Callbackaufruf in die onPostExecute packen muss.

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

Antworten