android - NPE @ android.support.v7.widget.RecyclerView$LayoutManager.detachViewInternal

标签 android android-espresso

当我从 espresso 2.0 切换到 2.1 时,我遇到了这个奇怪的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ChildHelper.detachViewFromParent(int)' on a null object reference
    at android.support.v7.widget.RecyclerView$LayoutManager.detachViewInternal(RecyclerView.java:5407)
    at android.support.v7.widget.RecyclerView$LayoutManager.detachViewAt(RecyclerView.java:5400)
    at android.support.v7.widget.RecyclerView.setAdapterInternal(RecyclerView.java:647)
    at android.support.v7.widget.RecyclerView.swapAdapter(RecyclerView.java:594)
    at org.ligi.passandroid.ui.PassListActivity.onCreate(PassListActivity.java:161)
    at android.app.Activity.performCreate(Activity.java:5990)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:489)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
    at android.app.ActivityThread.access$800(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5257)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

那里的代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.pass_list);
        ButterKnife.inject(this);

        AXT.at(openFileFAB).setVisibility(Build.VERSION.SDK_INT >= VERSION_STARTING_TO_SUPPORT_STORAGE_FRAMEWORK);

        final LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        (!!here!!) recyclerView.setLayoutManager(llm);

当我运行应用程序或使用 espresso 2.0 对其进行测试时,它不会在那里崩溃

最佳答案

这是一个奇怪的问题,所以我会先给出一个对我有用的解决方案,然后尝试解释我认为正在发生的事情。

快速修复是在测试构建配置中重新声明您的支持库依赖项:

androidTestCompile 'com.android.support:support-v4:22.1.1'
androidTestCompile 'com.android.support:appcompat-v7:22.1.1'
androidTestCompile 'com.android.support:cardview-v7:22.1.1'
androidTestCompile 'com.android.support:gridlayout-v7:22.1.1'
androidTestCompile 'com.android.support:recyclerview-v7:22.1.1'

这应该可以解决您的问题。

解释很奇怪:看起来像 espresso-contrib:2.1 依赖于旧版本的 com.android.support:recyclerview-v7:22.0.0 .这可以使用 Gradle app:dependencies 任务进行检查:./gradlew app:dependencies。这种依赖性以某种方式优先于编译中声明的依赖性并将其拉低到旧版本:

+--- com.android.support.test.espresso:espresso-contrib:2.1
|    +--- com.android.support:recyclerview-v7:22.0.0
|    |    \--- com.android.support:support-v4:22.0.0
|    +--- com.android.support:support-v4:22.0.0
|    \--- com.android.support.test.espresso:espresso-core:2.1 (*)

这可以使用 app:dependencyInsight 任务来确认: ./gradlew app:dependencyInsight --configuration androidTestCompile --dependency recyclerview-v7

com.android.support:recyclerview-v7:22.0.0
\--- com.android.support.test.espresso:espresso-contrib:2.1
     \--- androidTestCompile

结果是测试构建使用不同(顺序)版本的 recyclerview-v7 结果证明是错误的。添加 androidTestCompile 有助于 Gradle 检测冲突并正确解决冲突。修复后:

com.android.support:recyclerview-v7:22.1.1 (conflict resolution)
\--- androidTestCompile

com.android.support:recyclerview-v7:22.0.0 -> 22.1.1
\--- com.android.support.test.espresso:espresso-contrib:2.1
     \--- androidTestCompile

关于android - NPE @ android.support.v7.widget.RecyclerView$LayoutManager.detachViewInternal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30008836/

相关文章:

Android 在代码中使用颜色资源值

android - 灰色瓷砖 Android 谷歌地图模拟器

android - 使用 nexus 5 设备启用在 android 6.0 上监控信标

android - WebView 中不可点击的链接

android - 如何在设置 "Android/data/your_package/cache"后在 sdcard 上创建文件夹 "Clear data"?

android - 如何让 espresso 等待启动画面完成然后开始测试

android - Espresso 测试不会写入 EditText

android - 如何使用 Espresso 测试获取 Android 项目的覆盖率

java - 生成的 Android espresso 测试运行失败,AndroidJUnitRunner 解析失败 : Landroidx/test/platform/io/FileTestStorage;

android - 在 Android Espresso UI 测试中从 Facebook 注销