我正在使用支持库,并且我有一个片段(我将调用“MyFragment”)实现在 OnClick 事件期间由片段视图之一调用的方法。OnClickListener 在 OnActivityCreate 方法中设置如下:
@Override
public void onActivityCreated(Bundle inState) {
super.onActivityCreated(inState);
ViewGroup base = (ViewGroup) getView();
TextView tv = (TextView) base.findViewById(R.id.monografiat);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showStuff(); // MyFragment:150
}
});
}
其中 showStuff() 触发片段视图的更改,就像更新项目的可见性一样简单:
private void showStuff() { //MyFragment:95
ViewGroup base = (ViewGroup) getView();
LinearLayout ll = (LinearLayout) base.findViewById(R.id.someview); // MyFragment:97
ll.setVisibility(View.VISIBLE);
}
在我的测试中一切正常,我的大多数用户也是如此,但是我今天从 Google Play 开发者控制台收到了一份 ANR 报告,指出该应用程序因用户出现 NullPointerException 而崩溃:
LinearLayout ll = (LinearLayout) base.findViewById(R.id.someview);
意思就是:
ViewGroup base = (ViewGroup) getView();
返回空值。这是报告:
java.lang.NullPointerException
at mypackage.MyFragment.showStuff(MyFragment.java:97)
at mypackage.MyFragment.access$0(MyFragment.java:95)
at mypackage.MyFragment$2.onClick(MyFragment.java:150)
at android.view.View.performClick(View.java:2538)
at android.view.View$PerformClick.run(View.java:9152)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
我已经解决了这个问题(或者我认为,因为我没有复制方法......)只是用一个围绕有问题的行:
if(base != null) {
}
我最好的猜测是在 MyFragment 上调用 onDestroyView之后安排了回调,从而导致 getView() 返回 null。
尽管如此,我还是对这个错误感到很困惑,所以我希望你对此事有见解:
假设我的hypotesys是正确的,当没有布局存在时执行OnClick回调是否正常,或者我可以将此行为视为错误(老实说:当我单击它时视图显然就在那里,为什么它应该死在我)?
这个问题是否与我正在使用支持库(最新版本,2013 年 5 月 13 日)有关?
如果这不是错误并且我遗漏了一些东西,请您指出相关文档吗?
感谢您的关注!