我在获取 View 的高度时遇到了一些困难。目前,在应用冷启动时, View 上的 getMeasuredHeight()
返回 0
。
现在,我知道了解决这个问题的方法。发生这种情况是因为尚未布置 View 。不幸的是,使用像 addOnGlobalLayoutListener
这样的东西是不够的;我需要此 View 的高度(工具栏 + TabLayout
或只是一个工具栏,具体取决于用户的设置)以使用 setProgressCircleOffset() 设置
。在应用冷启动时,SwipeRefreshLayout
的偏移量SwipeRefreshLayout
显示为“正在刷新”。任何时候加载或更改数据时,它都会显示为“刷新”。如果我不知道高度,则 SwipeRefreshLayout
不会显示它正在“刷新”。我不能在冷启动开始时延迟计算,因为我需要它;更不用说它可能是两种可能的高度之一。
所以我的问题是:因为我们可以获得设备的 DPI,而且我通常可以估计(通过反复试验) View 的高度(在 dp
中)(并且它是交替的)--是否可以创建一个“公式”或根据屏幕尺寸调整偏移量的东西?我知道我需要将 dp
转换为 px
,但除此之外,我不确定该怎么做。
例如,我知道这个 View 的高度在我的 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()));
像魅力一样工作!
关于android - 冷启动时难以获得自定义 View 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36287400/