2014-09-27 4 views
1

Этот человек заставляет меня и мою команду полностью сумасшедшим.findViewById возвращает null TextView

Мы не можем воспроизводить, так как он хорошо работает на всех наших тестовых устройствах, но мы получаем тысячи отчетов о сбоях, жалующихся на java.lang.NullPointerException для TextView, который получается findViewById в onCreate (после вызова setContentView и с помощью правильный идентификатор и файл макета)

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 объявлен как TextView вне метода OnCreate, как мы используем его в другом месте.

+2

У вас есть несколько экземпляров premium_activity_layout, в папках с различной квалификацией? –

+0

Может быть, вы объявили несколько идентификаторов с таким же именем «premiumHeaderTextView» в разных макетах и ​​не определены в вашем premium_activity_layout. Поэтому, пожалуйста, проверьте его еще раз. – Yogendra

+0

@ G.BlakeMeike только одна копия файла макета. – Erwan

ответ

3

Сумасшедшее решение для сумасшедшей ошибки!

Как и ожидалось в моем предыдущем комментарии, ошибка возникает из-за того, что старый файл xml-файла для таблиц (под/res/layout-large) удален в нашей последней версии (теперь мы используем один файл макета под/res/layout).

Помните строку вызывая Null исключение:

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

Это связано с тем, что наш бывший макет версии не имеют никакого представления с идентификатором = premiumHeaderTextView и что на некоторых таблетках для пользователей, которые модернизированных от перед новой версией старый файл макета не был удален, и поэтому система ищет идентификатор в старом /res/layout-large/premium_activity_layout.xml, а не в новом (общем для всех устройства)/res/layout /premium_activity_layout.xml

Использование crashlytics для понимания того, что все аварии происходили на t устройства ablet были ключевыми для идентификации этой «ошибки», которая кажется системной ошибкой на некоторых планшетах, поскольку они не должны хранить старые файлы ресурсов при обновлении apk.

Итак, я скопировал /res/layout/premium_activity_layout.xml в/res/layout-large, чтобы заставить пользователей планшета использовать новый макет, а не старую «кэшированную» версию. Это полностью исправило ошибку