我有一个问题,在哪里ListFragment.onListItemClick
调用 after onDestroyView
。我在现场收到了很多错误报告(大约 1000 个活跃用户每天 10-20 个),但我发现重现它的唯一方法是在单击整个屏幕时敲击后退按钮。成百上千的用户真的在这样做吗?这是跟踪:
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 为空。
一种解决方法是getListView
用listView
从回调传入的
替换public void onListItemClick(ListView listView, View v, int position, long id)
,但其他函数仍需要更新 UI 的其他部分,所以这只会将问题转移到其他地方。相反,我取消了回调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
。我是否需要手动清除我这样设置的每个侦听器?
这与未回答的问题类似:Fragment's getView() 在 OnClickListener 回调中返回 null
setOnRetainInstance(true)
顺便说一句,我在我的片段中使用。