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 不会显示任何内容

如何在列表视图中为带有自动换行的可变多行长文本自动调整项目高度?

具有动态高度的集合视图水平方向

如何根据其中的内容创建具有动态高度的集合视图?

如何在具有颤动的可滚动视图中使用具有可变高度内容的TabView?