【问题标题】:Robolectric returns 0 height for a view with wrap content heightRobolectric 为具有换行内容高度的视图返回 0 高度
【发布时间】: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没有解决

标签: android layout view robolectric layout-inflater


【解决方案1】:

使用 测试方法上方的@TextLayoutMode(REALISTIC) 注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多