Ich habe ein Problem, wo ListFragment.onListItemClick
nach onDestroyView
aufgerufen wird. Ich erhalte viele Fehlerberichte in dem Feld (10-20 pro Tag von ~ 1000 aktiven Benutzern), aber die einzige Art, die ich gefunden habe, um sie zu reproduzieren, besteht darin, den Zurück-Knopf zu drücken, während man auf den ganzen Bildschirm klickt. Machen Hunderte von Benutzern das wirklich? Dies ist die Spur:Fragment OnClickListener aufgerufen nach onDestroyView
java.lang.IllegalStateException: Content view not yet created
at au.com.example.activity.ListFragment.ensureList(ListFragment.java:860)
at au.com.example.activity.ListFragment.getListView(ListFragment.java:695)
at au.com.example.activity.MyFragment.onListItemClick(MyFragment.java:1290)
at au.com.example.activity.ListFragment$2.onItemClick(ListFragment.java:90)
at android.widget.AdapterView.performItemClick(AdapterView.java:301)
at android.widget.AbsListView.performItemClick(AbsListView.java:1519)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3278)
at android.widget.AbsListView$1.run(AbsListView.java:4327)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5293)
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:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
verursacht von getListView().getItemAtPosition
in MyFragment.onListItemClick
(MyFragment: 1290) aufrufen. Wie kann getView
während eines Click-Handler-Callbacks null zurückgeben? Ich stellte auch fest, dass das Fragment zu diesem Zeitpunkt abgetrennt war, isAdded() falsch war und getActivity null war.
Eine Abhilfe wäre getListView
zu ersetzen mit den listView
übergeben von dem Rückruf public void onListItemClick(ListView listView, View v, int position, long id)
, aber auch andere Funktionen müssen noch andere Teile der Benutzeroberfläche aktualisieren, so würde dies nur das Problem woanders bewegen. Stattdessen nulled ich den Rückruf in onDestroyView
:
public void onDestroyView() {
mHandler.removeCallbacks(mRequestFocus);
if(mList!=null){
mList.setOnItemClickListener(null);
}
mList = null;
mListShown = false;
mEmptyView = mProgressContainer = mListContainer = null;
mStandardEmptyView = null;
super.onDestroyView();
}
Aber ich habe immer noch dieses onClick Problem in anderen (nicht-Liste) zu Fragmenten. Wie genau unterdrückt das Framework diese Rückrufe normalerweise, wenn das Fragment entfernt wird (z. B. in onBackPressed -> popBackStackImmediate()
)? In onDestroyView
, ich null zusätzliche Ansichten, die ich in onCreateView
erstellt habe. Muss ich jeden Listener manuell löschen, den ich so eingestellt habe?
Dies ist ein ähnliches Problem auf die unbeantwortet q: Fragment's getView() returning null in a OnClickListener callback
Ich setOnRetainInstance(true)
in meine Fragmente verwenden, btw.
können Sie den Fragmentcode geben? –
Können Sie Ihren Onclick-Code posten? Machst du irgendwelche Hintergrundarbeit dort? Überprüfst du, ob getView() == null im onclick ist? – user1634451
unterstützt Ihre App Rotationen? Wenn sich das Telefon dreht, wird die aktuelle Aktivität zerstört und eine neue erstellt. Dies bedeutet, wenn der Benutzer auf ein Objekt kurz vor der Rotation geklickt hat, wird der Klick wieder angezeigt, aber der Aktivitätskontext und die Ansicht sind null. Wie vorgeschlagen, überprüfen Sie, ob die Ansicht nicht null ist, stellen Sie sicher, dass Sie nicht versuchen, während einer Rotation auf den Kontext zuzugreifen (weil er zerstört ist). – toidiu