android - 冷启动时难以获得自定义 View 的高度

标签 android android-layout screen-density

我在获取 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/

相关文章:

android - 在 react native 的 ListView 中简单转到页面

android - 带有 ListView fragment 的 ViewPager - 指定的子项已有父项

java - 自定义 ListView 项目选择不起作用

Android相对布局使用dp跳遍

java - Bar.setBarStyle(BarStyle.RECTGRADIENT) 不按预期工作

java - 想要访问 firebase cloud firestore 但存在运行时错误

android - 如何在android中创建自定义下拉菜单

android - 我的 UI 在设计器中和在设备上看起来不同

Android 420 dpi 和 560dpi