在渲染到布局之前获取文本视图的高度

2024-03-21

找不到什么好的解决办法计算textview高度其中文本在渲染文本视图到布局之前设置。请提供任何帮助


2个解决方案

一开始用的是方案1,后来找到了方案2。两者都有效,这确实是您喜欢的。

重要的是要确保所有尺寸都正确,因为混合 sp 或 px 字体大小会产生很大的差异,具体取决于您测试的屏幕。

一个非常基本的示例项目位于https://github.com/hanscappelle/SO-3654321 https://github.com/hanscappelle/SO-3654321

解决方案 1 使用 TextView 和 MeasureSpec

原始问题的主要问题是下面方法中的 TextView 应该配置为我们的 TextView ,它应该渲染到布局。我认为这个解决方案对于许多面临这个问题的人来说是有价值的。

public static int getHeight(Context context, CharSequence text, int textSize, int deviceWidth, Typeface typeface,int padding) {
            TextView textView = new TextView(context);
            textView.setPadding(padding,0,padding,padding);
            textView.setTypeface(typeface);
            textView.setText(text, TextView.BufferType.SPANNABLE);
            textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
            int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
            int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            textView.measure(widthMeasureSpec, heightMeasureSpec);
            return textView.getMeasuredHeight();
        }

以及如何使用它的示例:

// retrieve deviceWidth
int deviceWidth;
WindowManager wm = (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
    Point size = new Point();
    display.getSize(size);
    deviceWidth = size.x;
} else {
    deviceWidth = display.getWidth();
}
// the text to check for
String exampleTextToMeasure = "some example text that will be long enough to make this example split over multiple lines so we can't easily predict the final height";
//  some dimensions from dimes resources to take into account
int textSize = getContext().getResources().getDimensionPixelSize(R.dimen.text_size);
int padding = getContext().getResources().getDimensionPixelSize(R.dimen.text_padding);

// final calculation of textView height
int measuredTextHeight = getHeight(getContext(), exampleTextToMeasure, textSize, deviceWidth, TypeFace.DEFAULT, padding); 

解决方案 2 使用 TextPaint 和 StaticLayout

此方法依赖于 TextPaint 和 StaticLayout,它们还在我迄今为止测试过的所有 API 级别上提供了可靠的结果。注意尺寸单位;一切都应该以像素为单位!

Source: 测量要在画布上绘制的文本高度(Android) https://stackoverflow.com/questions/3654321/measuring-text-height-to-be-drawn-on-canvas-android

    public static int method1UsingTextPaintAndStaticLayout(
            final CharSequence text,
            final int textSize, // in pixels
            final int deviceWidth, // in pixels
            final int padding // in pixels
    ) {

        TextPaint myTextPaint = new TextPaint();
        myTextPaint.setAntiAlias(true);
        // this is how you would convert sp to pixels based on screen density
        //myTextPaint.setTextSize(16 * context.getResources().getDisplayMetrics().density);
        myTextPaint.setTextSize(textSize);
        Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
        float spacingMultiplier = 1;
        float spacingAddition = padding; // optionally apply padding here
        boolean includePadding = padding != 0;
        StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, deviceWidth, alignment, spacingMultiplier, spacingAddition, includePadding);
        return myStaticLayout.getHeight();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在渲染到布局之前获取文本视图的高度 的相关文章

  • Android EditText 和 addTextChangedListener

    我目前正在将数据库管理器移植到 Android 由于性能原因 我喜欢 仅更新已修改的属性 我尝试使用 addTextChangedListener 执行此操作 以便将修改后的条目添加到列表中 但我的程序从未输入其任何方法 EditText
  • 升级到最新支持库后Android JACK编译器错误

    Android Studio 2 2 3 Windows 10 64位 构建工具版本 25 Android Gradle插件版本2 2 3 升级到最新的支持库 从 23 4 0 到 25 1 0 并更改编译版本 从 23 到 25 后 我收
  • 使用同一个侦听器的多个活动

    我有 4 个活动 它们都包含一个 xml 页脚 其中包含 4 个按钮 每个活动一个 我现在想为这些按钮设置 onclicklistener 它是页脚中的自制菜单 问题是 如何使用侦听器以便重用代码 我有两个想法 创建一个实现 onclick
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 蓝牙 BLE Android 以最大吞吐量写入外设

    我们公司开发了一个具有蓝牙 BLE 的硬件单元 并且我们在 Nexus 7 2013 中有一个服务应用程序 我们希望使用它向该单元发送固件文件 文件最大可达 500kb BT芯片是德州仪器CC2540 我浏览了大量的页面 并扫描了 Stac
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • java.lang.IllegalAccessError:预验证类中的类引用在运行测试项目时解析为意外实现?

    在实施项目工作正常之后 我使用第三方库 zxing 实施了项目 然后在我编写了一个测试项目对我的项目进行单元测试之后 运行测试项目后 主项目 类及其方法没有给出任何信息错误 但如果在主项目的该方法中使用任何 zxing 框架类 则会在运行时
  • Android 和 Google 地图内部片段以及其他控件和 viewpager

    我是android编程新手 我有一个带有 3 个页面 片段 的小应用程序 使用 pageradapter 和 viewpager 在它们之间滑动 其中一个页面包含复选框 和其他控件 和地图 我的问题是程序在启动时崩溃 Fragment co
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • Jetpack Compose:制作全屏(绝对定位)组件

    我怎样才能在全屏渲染树的深处制作一个可组合的 类似于Dialog可组合作品 例如 当用户单击图像时 它会显示该图像的全屏预览 而无需更改当前路线 我可以用 CSS 来做到这一点position absolute or position fi
  • 如何在Android模拟器中隐藏应用程序图标?

    我有一个应用程序在启动完成后自动启动 但应用程序图标显示在android模拟器中 现在我想向用户隐藏该图标 这样用户就无法知道应用程序已启动 并且他们无法启动该应用程序手动申请 在您的 AndroidManifest xml 文件中 您可能
  • 我在 android studio 中使用 kotlin 时出现错误

    为什么会出现这个错误 09 12 16 36 31 502 1886 1886 com getloction nourmedhat smartgate getlocation E AndroidRuntime 致命异常 main 进程 co
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto

随机推荐

  • 启动 spring web mvc 应用程序时出现异常

    当我使用 spring 3 2 9 时 我的 spring 项目工作正常 但如果我将其更改为 4 1 4 则在启动应用程序时会出现以下异常
  • 使用 C# 向 GMail 发送 IMAP 命令

    我一直在尝试访问我的 GMail 帐户以从我的电子邮件帐户中检索未读电子邮件 但是 我只执行登录 之后的任何操作都不起作用 首先 我连接到服务器 然后发送登录命令 最后发送检查命令 问题是收到的响应仅涉及连接和登录 之后 它就停止等待从 S
  • 通用保存方法

    在我的通用存储库中 我需要编写通用 Save 方法 该方法将根据 id 编辑现有实体或添加新实体 public void Save
  • Docker:更改存储 docker 卷的文件夹

    On my Ubuntu EC2我使用 docker 容器托管一个应用程序 db数据和upload数据存储在卷中CaseBook data db and CaseBook data uploads这是使用以下命令创建的 docker vol
  • EFcore 中“FromSql”操作的结果中不存在所需的列“id”

    我有一个大问题FromSql就是这样 我有一个这样的模型 public partial class model public string name 我想从数据库 sql server 中的过程中获得一些结果 当我执行下面的代码时 var
  • Android 中的处理程序和内存泄漏

    请看下面的代码 public class MyGridFragment extends Fragment Handler myhandler new Handler Override public void handleMessage Me
  • 将一个静态共享库链接到我的共享库

    我在链接我当前正在从事的项目的一些选项方面遇到了一些困难 我正在尝试创建一个与其他 2 个库链接的共享库 我们称他们为libfoo so and libbar so 我的输出库必须是共享库 并且我想要静态链接libfoo so到生成的库 但
  • 无需 Visual Studio 即可部署到 Azure WebRole

    有没有一种方法可以将我的整个网站 Web 应用程序部署到 Azure WebRole 而不需要 Visual Studio Context IIS 网络部署 http www iis net downloads microsoft web
  • 如何在React Native中以redux形式设置隐藏字段?

    如何在React Native中以redux形式设置隐藏字段 我只是找不到任何方法来做到这一点 有什么帮助吗 我结束使用这个 this props dispatch change FORM NAME FIELD NAME VALUE 运行此
  • 为什么这个图在添加散点时失败,但在删除散点时却有效?

    我正在使用以下内容来绘制 x 日期和 y 小数 如果没有注释行 散点 它的效果很好 但是如果您取消注释它 它会在一个 x 轴上显示所有内容 我缺少什么 thanks import matplotlib pyplot as plt impor
  • 使用 TypeScript 实现流畅的 API?

    我正在尝试用 TypeScript 开发一个流畅的 api 我想使用它 如下所示 export interface Person firstName string lastName string new Builder
  • 您如何比较今年和去年同一周的同一天?

    大多数零售商在销售报告中使用商品日历 这可以帮助他们找到当年和上一年同一周的同一天 例如今天是 2016 10 10 星期一 上一年 2015 年同一周 星期一是 2015 年 10 月 12 日 我们如何通过 SQL 查询捕获这一点并将它
  • 分页库和房间具有不同的 PagedLists,取决于不同的请求

    我正在尝试使用新的 Android 架构组件设置所有列表 房间持久性库 https developer android com topic libraries architecture room html and 分页库 https dev
  • 如何使用批处理文件构建解决方案

    我想使用批处理文件构建 NET 解决方案 我知道我需要使用以下语句 devenv build release D Source Code Source test sln 但我不知道如何创建将在 VS 命令提示符下执行的批处理文件 Visua
  • .Net 的 RSS/Atom 解析库

    我正在尝试找到一个可以读取给定 RSS Atom 提要的库 并且可以猜测其格式并将其抽象为项目列表 这个想法是构建一个可以接收任何提要的简单 RSS 阅读器 我知道 PHP 有一些库可以做到这一点 但我找不到任何 Net 版本 如果您使用的
  • 仅获取未隐藏的元素.. Jquery

    我只需要获取 jquery foreach 循环中的 show 元素 在下面的代码中 我得到了所有带有类测试的元素 即隐藏和显示的元素 但只需要显示而不是隐藏一个 如何过滤并在这一行本身中获取它 element find test each
  • 将 Symfony 翻译传递给 Symfony Webpack Encore

    对于 Symfony 我使用翻译 https symfony com doc current components translation html 树枝和Webpack 再来一次 https symfony com doc current
  • 从网站获取html源代码,然后从html文件中获取元素

    我想获取网站的 HTML 代码 然后从该 HTML 文件中获取某个元素 有些东西可以获取 HTML 代码 例如 ajax 和 jquery 我正在使用节点并希望它是完整的JavaScript 另外 我不知道如何从中获取某个元素 我已经在 p
  • Perl,数组的哈希:添加和删除键,添加到数组,所有这些都在 while 循环中

    我有一个散列 它应该包含链接到它们自己的数组的某些键 更具体地说 哈希键是质量值 数组是序列名称 如果已经存在该质量的数组 我想将序列名称添加到链接到相关质量的数组中 如果没有 我想创建一个并向其添加序列名称 所有这些都是在 while 循
  • 在渲染到布局之前获取文本视图的高度

    找不到什么好的解决办法计算textview高度其中文本在渲染文本视图到布局之前设置 请提供任何帮助 2个解决方案 一开始用的是方案1 后来找到了方案2 两者都有效 这确实是您喜欢的 重要的是要确保所有尺寸都正确 因为混合 sp 或 px 字