gpt4 book ai didi

android - 自升级到 Robolectric 4.3 以来,ListView 的 onItemClickListener 得到一个空 View

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:38 24 4
gpt4 key购买 nike

我的activity的布局基本就是这样(为了说明问题做了简化)。基本上,如果设备的屏幕很小,ListView 就没有太多空间可以显示,因为其他 View 占据了所有空间:

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

我的 Activity 代码设置项目点击监听器如下:

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 View 调用。

最佳答案

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

详细信息:经过一些调试,我发现在 Robolectric 4.2.1 中,ListView 的高度是 146 (top=680, bottom =826),但对于 Robolectric 4.3,它是 0(top=680bottom=680)。 Robolectric 使用的默认设备高度是 470,这不足以显示列表。该列表在 Robolectric 4.3 中没有任何 subview 。

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

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")

关于android - 自升级到 Robolectric 4.3 以来,ListView 的 onItemClickListener 得到一个空 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com