У меня проблема, когда ListFragment.onListItemClick вызывается после onDestroyView. Я получаю много сообщений об ошибках в поле (10-20 в день ~ 1000 активных пользователей), но единственный способ, которым я нашел, чтобы воспроизвести его, - это забить кнопку "Назад", щелкая по всему экрану. Действительно ли сотни пользователей действительно это делают?
Это трассировка:
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)
Вызывается при вызове getListView().getItemAtPosition в MyFragment.onListItemClick (MyFragment: 1290). Как getView вернуть значение null во время обратного вызова обработчика щелчка? Я также решил, что фрагмент был отсоединен на этом этапе, isAdded() был ложным, а getActivity - null.
Одним из способов было бы заменить getListView на listView, переданный из обратного вызова
public void onListItemClick(ListView listView, View v, int position, long id), но другим функциям все равно придется обновлять другие части пользовательского интерфейса, так что это просто переместит проблему в другое место.
Вместо этого я отключил обратный вызов в 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();
}
Но у меня все еще есть эта проблема onClick в других (не-список) фрагментах тоже. Как именно структура обычно подавляет эти обратные вызовы при удалении фрагмента (например, в onBackPressed -> popBackStackImmediate())?
В onDestroyView я исключаю дополнительные представления, которые я создал в onCreateView. Нужно ли вручную очищать каждый прослушиватель, который я установил так?
Это аналогичная проблема с неотвеченным q: getView() Fragment, возвращающим null в обратном вызове OnClickListener
Я использую setOnRetainInstance(true) в своих фрагментах, кстати.