【问题标题】:Measure TextView height - auto wrap测量 TextView 高度 - 自动换行
【发布时间】:2017-03-16 01:38:10
【问题描述】:

我创建了一个可扩展的卡片视图,其中包含标题、副标题和详细文本视图。

现在我想根据 wrap_content 的文本视图中的文本高度动态获取高度。所以我在 onClickListener 的视图中使用了.measure 方法:

holder.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
           holder.getDetailText().measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
           Log.i("Project", ""+ holder.getDetailText().getMeasuredHeight());
    }

});

我得到了 57 的高度和这段文字:

holder.getDetailText().setText("Test Test Test Test");

如果我现在在其中添加一个更长的文本,它会自动换行成多行,我会得到相同的高度 57

holder.getDetailText().setText("Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test ...");

只要我在其中放入带有新换行符的文本,一切都会按预期工作,导致高度为 155

holder.getDetailText().setText("Test\nTest\nTest");

那么如何使用自动换行的文本获取 textview 的实际高度呢?

更新: 这是一个自动换行的很长的文本,但我得到的高度是 57,所以它只会显示第一行,因为 getMeasuredHeight 只返回这个 (57) 高度。

我所期望的,但不起作用,因为 getMeasuredHeight 返回错误的高度:

如果我手动放置\n 提要,那么没有自动换行getMeasuredHeight 返回正确的高度,一切都按预期工作。

.measure 似乎忽略了宽度,因为即使我放一个常数值,getMeasuredHeight 返回的高度也不会改变。

【问题讨论】:

  • 当需要计算textView的高度时。能否请您指定场景,以便我可以帮助您
  • 我有一个 recyclerview 项目根据高度和文本视图中的文本数量扩展,因此扩展的高度将适合文本。
  • 如何使用自动换行的文本获取 textview 的实际高度?表示自动表示的意思
  • 如果你在 textview 中放了很长的文本,Android 会自动将长文本放在多行中。
  • 所以,textview 的大小会增加,或者如果它会进入下一行,那么您想获得 textView 的高度吗?可以的话可以附上截图吗

标签: android android-layout height android-view measure


【解决方案1】:

对于长文本,TextView 需要一定的时间来渲染。所以在此之前我们正在计算那个 TextView 的高度

使用以下代码:

view.setText("Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test ...");

view.getViewTreeObserver()
    .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Toast.makeText(getApplicationContext(), "Height :- " + view.getMeasuredHeight(), Toast.LENGTH_SHORT).show();
        }
    });

请参考How to find the Text Area(Height/Width) of TextView programmatically in android

如果您想查看 TextView 的确切行为,请创建一个 CustomTextView 并查看其生命周期的行为。

如果它不适合你,请告诉我。

【讨论】:

    【解决方案2】:

    不知道你有没有找到解决办法, 解决方案是当您测量具有指定宽度的高度时 如果您没有获得所需的高度,则需要非常小心宽度(因为计算非常精确),这意味着您在规范中遗漏了一些东西,

    示例如下

    val widthMeasureSpec =
          View.MeasureSpec.makeMeasureSpec(ceil(context.resources.getDimension(R.dimen.text_width)).toInt(), View.MeasureSpec.EXACTLY)
        val heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED).  
    

    在上面的代码中,你传递的宽度参数很重要,

    • 您需要传递您为 textview 传递的确切宽度
    • 在我的情况下,您需要将度量规范传递为 View.MeasureSpec.EXACTLY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2013-06-07
      相关资源
      最近更新 更多