自从升级到Robolectric 4.3之后,ListView的onItemClickListener得到了一个空视图

时间:2019-06-04 16:24:17

标签: android robolectric

我的活动布局基本上是这样(简化以说明问题)。如果设备的屏幕较小,则ListView基本上没有显示空间,因为其他视图占据了所有空间:

<LinearLayout orientation="vertical">
    <SomeBigView
        layout_width="match_parent"
        layout_height="680dp"/>
    <ListView
        layout_width="match_parent"
        layout_height="wrap_content" />
</LinearLayout>

我的活动代码如下设置项目点击侦听器:

list.onItemClickListener = AdapterView.OnItemClickListener { _, view, _, _ ->
    Snackbar.make(view, "Clicked on $view", Snackbar.LENGTH_SHORT).show()
}

我的单元测试点击列表中的第一项:

val controller = Robolectric.buildActivity(MainActivity::class.java)
    .create().start().resume().visible()
val list: ListView = controller.get().findViewById(R.id.list)
shadowOf(list).performItemClick(0)

在Robolectric 4.2.1中,我的点击侦听器使用非空view调用。 在Robolectric 4.3中,它以null视图进行调用。

1 个答案:

答案 0 :(得分:3)

摘要: 解决方案是使用@Config(qualifiers="h780dp")注释为此测试指定更大的设备高度。

详细信息: 经过一些调试后,我发现在Robolectric 4.2.1中,ListView的高度为146top=680bottom=826),而在Robolectric 4.3中为{{1 }}(0top=680)。 Robolectric使用的默认设备高度为bottom=680,不足以显示列表。该列表在Robolectric 4.3中没有任何子视图。

470的实现在robolectric的shadowOf(list).performItemClick(0)中找到,并且是:

ShadowAdapterView

在Robolectric 4.3中,public boolean performItemClick(int position) { return realAdapterView.performItemClick(realAdapterView.getChildAt(position), position, realAdapterView.getItemIdAtPosition(position)); } 返回getChildAt(position),这就是转发给点击侦听器的内容。

解决方法是为此测试指定更大的设备屏幕。例如:

null