冷启动时难以获得自定义视图的高度

Difficulty getting the height of a custom view on cold start

我在获取视图的高度时遇到了一些困难。目前,在冷启动应用程序时,getMeasuredHeight() 在视图 returns 0.

现在,我知道解决这个问题的方法了。发生这种情况是因为尚未布置视图。不幸的是,使用 addOnGlobalLayoutListener 之类的东西是不够的;我需要此视图的高度(一个工具栏 + TabLayout 或只是一个工具栏,具体取决于用户的设置)以使用 setProgressCircleOffset() 设置 SwipeRefreshLayout 的偏移量。在冷启动应用程序时,SwipeRefreshLayout 显示为 "refreshing"。任何时候加载或更改数据时,它都会显示为“刷新”。如果我不知道高度,那么 SwipeRefreshLayout 就不会显示它是 "refreshing"。我不能在冷启动开始时延迟计算,因为我需要它;更何况它可能是两种可能的高度之一。

所以我的问题是:因为我们可以获得设备的 DPI,而且我通常可以估计(通过反复试验)视图的高度(在 dp 中)(并且它是备用的) --是否可以创建一个 "formula" 或根据屏幕尺寸调整偏移量的东西?我知道我需要将 dp 转换为 px,但除此之外,我不确定该怎么做。

例如,我知道这个视图的高度在我的 Nexus 6 上是 334px(设置为 513dpi);但它在我的库存 Pixel C 上肯定更少(334px 的偏移量在 Pixel C 上太多了)。

感谢 AMAN77,我最终解决了这个问题。

我得到了设备显示的高度(以像素为单位的总高度)然后乘以一个百分比(我通过反复试验得到)作为偏移量。

这是我所做的:

    int screenHeight = getContext().getResources().getDisplayMetrics().heightPixels;
    int headerOffset = Math.round((float) (screenHeight * 0.13));

    //if the user has the "toolbar" setting enabled, we need a different offset
    if (SettingValues.single) {
        headerOffset = Math.round((float) (screenHeight * 0.07));
    }

    mSwipeRefreshLayout.setProgressViewOffset(false,
            headerOffset - Reddit.pxToDp(42, getContext()),
            headerOffset + Reddit.pxToDp(42, getContext()));

工作得很好!