【发布时间】:2013-07-22 10:37:16
【问题描述】:
我正在使用支持库,并且我有一个 Fragment(我将称之为“MyFragment”)实现了一个在 OnClick 事件期间由 Fragment 的视图之一调用的方法。 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() 会触发 Fragment 视图的更改,就像更新项目的可见性一样简单:
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 日)有关?
如果这不是错误并且我遗漏了一些东西,请您指出相关文档吗?
感谢您的关注!
【问题讨论】:
-
您使用
ViewGroup代替View的任何原因?您是否还可以检查R.id.someview是否在getView()返回的视图中定义? -
不是在这个特殊场合,但是我知道布局是 ViewGroup 的子类(否则 Java 会抛出 ClassCastException)。至于 R.id.someview,如果找不到对应的视图,则会在第 98 行(而不是第 97 行)抛出异常
-
你说得对,我完全错过了。
-
nop:还是谢谢你
-
onActivityCreated()回调是针对MyFragment的,对吗?此外,onActivityCreated()中使用的base变量是 ...?
标签: android android-fragments android-lifecycle android-support-library