其他分享
首页 > 其他分享> > android-由于升级到Robolectric 4.3,所以ListView的onItemClickListener会获得空视图

android-由于升级到Robolectric 4.3,所以ListView的onItemClickListener会获得空视图

作者:互联网

我的活动布局基本上是这样(简化以说明问题).如果设备的屏幕很小,则基本上没有足够的空间显示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,我的点击侦听器将以非null视图进行调用.
在Robolectric 4.3中,使用空视图调用它.

解决方法:

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

细节:
经过一些调试后,我发现使用Robolectric 4.2.1时,ListView的高度为146(顶部= 680,底部= 826),但是对于Robolectric 4.3,它的高度为0(顶部= 680,底部= 680). Robolectric使用的默认设备高度为470,这不足以显示列表.该列表在Robolectric 4.3中没有任何子视图.

从robolectric的ShadowAdapterView中可以找到shadowOf(list).performItemClick(0)的实现,该实现为:

public boolean performItemClick(int position) {
    return realAdapterView.performItemClick(realAdapterView.getChildAt(position),
        position, realAdapterView.getItemIdAtPosition(position));
}

在Robolectric 4.3中,getChildAt(position)返回null,这是转发给单击侦听器的内容.

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

@Test
@Config(qualifiers="h780dp")

标签:robolectric,android
来源: https://codeday.me/bug/20191108/2005152.html