findViewById返回null TextView

时间:2014-09-27 15:54:58

标签: android actionbarsherlock

这个让我和我的团队完全疯狂。

我们无法复制,因为它在我们所有的测试设备上运行良好,但我们收到数千个崩溃报告,抱怨java.lang.NullPointerException是一个TextView,它是由onCreate中的findViewById获取的(在调用setContentView之后)正确的id和布局文件)

java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxxxxxxxxxxx.activities.PremiumActivity}: java.lang.NullPointerException
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
       at android.app.ActivityThread.access$600(ActivityThread.java:140)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4895)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.NullPointerException
       at xxxxxxxxx.activities.PremiumActivity.onCreate(PremiumActivity.java:258)
       at android.app.Activity.performCreate(Activity.java:5163)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
       at android.app.ActivityThread.access$600(ActivityThread.java:140)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4895)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
       at dalvik.system.NativeStart.main(NativeStart.java)

这是onCreate方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.premium_activity_layout);
    premiumInfoHeaderTextView = (TextView) findViewById(R.id.premiumHeaderTextView);
    int themeColor = MPThemeManager.getSharedInstance(this).themeColor();
    premiumInfoHeaderTextView.setTextColor(themeColor);

最后一行是导致nullPointerException(第258行)

的行

不确定它是否相关但活动扩展了SherlockFragmentActivity

当然,premiumInfoHeaderTextView在onCreate方法之外被声明为TextView,因为我们也在别处使用它。

1 个答案:

答案 0 :(得分:3)

疯狂修复疯狂的错误!!

正如我在之前的评论中所预料的那样,该错误来自于我们最新版本中已删除平板电脑的旧布局xml文件(在/ res / layout-large下)(我们现在使用/下的单个布局文件) RES /布局)。

记住导致Null异常的行:

premiumInfoHeaderTextView = (TextView) findViewById(R.id.premiumHeaderTextView);

这是因为我们以前的版本布局没有id = premiumHeaderTextView的任何视图,而且在某些平板电脑上,对于从之前版本升级到新版本的用户,旧的布局文件尚未删除,系统因此在旧的/res/layout-large/premium_activity_layout.xml中寻找id,而不是在新的(所有设备通用)/res/layout/premium_activity_layout.xml

中寻找id

使用crashlytics了解平板电脑设备上发生的所有崩溃是确定这个“错误”的关键,这似乎是某些平板电脑上的系统错误,因为在升级apk时它们不应该保留旧的资源文件。

总而言之,我将/res/layout/premium_activity_layout.xml复制到/ res / layout-large,以强制平板电脑用户使用新的布局,而不是旧的“缓存”版本。这完全解决了错误