Robolectric 为具有换行内容高度的视图返回 0 高度
Posted
技术标签:
【中文标题】Robolectric 为具有换行内容高度的视图返回 0 高度【英文标题】:Robolectric returns 0 height for a view with wrap content height 【发布时间】:2019-09-24 09:08:37 【问题描述】:我有一个想要测试的 android customView。
当 N 是 subView 高度时,很少有测试会模拟 N dps 的滚动。
我使用 robolectric 运行测试,但我总是在运行时得到 subView.getHeight() == 0
这是因为 subView 的高度定义为 wrap_content
,我猜 robolectric 不会膨胀所有视图来获得准确的信息。
例如,subView.getWidth > 0
定义为match parent
。
这是我的测试@before
方法:
@Before
public void setUp()
myView.getHeaderView().getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener()
@Override
public void onGlobalLayout()
myHeight =
myView.getHeaderView().getHeight();
);
activityScenarioRule
.getScenario()
.onActivity(activity -> activity.setContentView(myView));
activityScenarioRule.getScenario().moveToState(State.RESUMED);
我怎样才能在测试运行时仍然获得包装内容高度?
代码确实调用了onGlobalLayout
,但返回了height==0
【问题讨论】:
尝试在您的 SubView 上调用 measure() 和 layout(),和/或在 SubView 上设置 ViewTreeObserver.OnGlobalLayoutListener 并从那里获得视图尺寸 不是自动调用的吗?你的意思是从产品代码调用? 您可能获得子视图的高度太快,这是它返回 0 的原因,如果在产品代码上您在视图准备好之前获取视图尺寸,最好使用它一个 ViewTreeObserver.OnGlobalLayoutListener 所以你确定视图已经调用了它的方法,你可以暂时在测试代码上测试它,看看它是否工作 但是为什么我会得到视图的高度呢? 在测试@before
注册到ViewTreeObserver.OnGlobalLayoutListener
没有解决
【参考方案1】:
使用 测试方法上方的@TextLayoutMode(REALISTIC) 注释。
【讨论】:
以上是关于Robolectric 为具有换行内容高度的视图返回 0 高度的主要内容,如果未能解决你的问题,请参考以下文章
如何在屏幕上设置两个相同大小的RecyclerView,保持高度换行内容以避免空白
将视图动态添加到具有 wrap_content 高度的 LinearLayout 不会显示任何内容