冷启动时难以获得自定义视图的高度
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()));
工作得很好!
我在获取视图的高度时遇到了一些困难。目前,在冷启动应用程序时,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()));
工作得很好!