【问题标题】:findViewById returning null TextViewfindViewById 返回 null TextView
【发布时间】:2014-09-27 15:54:57
【问题描述】:

这个让我和我的团队彻底疯了。

我们无法重现,因为它在我们所有的测试设备上都运行良好,但是我们收到了成千上万的崩溃报告,它们抱怨通过 onCreate 中的 findViewById 获得的 TextView 的 java.lang.NullPointerException(在调用 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,因为我们也在其他地方使用它。

【问题讨论】:

  • 您是否有可能在不同的限定文件夹中拥有多个 premium_activity_layout 副本?
  • 可能是您在不同的布局中声明了多个具有相同名称“premiumHeaderTextView”的 id,并且未在您的 premium_activity_layout 中定义。所以请再次检查。
  • @G.BlakeMeike 布局文件只有一份。
  • @Yogendra 没有重复的 ID。
  • 我将尝试修复,如果我能确认它有效,我会更新你们。对于一个更奇怪的问题,这将是一个奇怪的解决方案: - 我注意到所有崩溃都发生在平板电脑设备上 - 我在 /res/layout 下只有一个布局文件 - 但是在以前的版本中,我曾经有过,我们在此版本中删除的平板电脑的 /res/layout-large。 => 似乎在某些平板电脑上,旧布局文件的“缓存”副本在更新 apk 时没有被删除,这可以解释崩溃。 => 我即将发布一个新版本,我的布局在 /res/layout-large 中重复

标签: android actionbarsherlock


【解决方案1】:

对疯狂错误的疯狂修复!

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

记住导致空异常的行:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多