У меня проблема, когда 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)
в своих фрагментах, кстати.