动态改变TextView文本,而不是使用省略号缩短文本

5

我有这段代码:

  final ViewTreeObserver[] viewTreeObserver = {myAcco    
    viewTreeObserver[0].addOnPreDrawListener(
        new OnPreDrawListener() {
          @Override
          public boolean onPreDraw() {
            int chipWidth =
                myAccountView.getMeasuredWidth()
                    - myAccountView.getPaddingLeft()
                    - myAccountView.getPaddingRight();
            if (chipWidth > 0) {
              myAccountView.setText(
                  setChipTextWithCorrectLength(
                      getContext().getString(R.string.og_my_account_desc_long_length),
                      getContext().getString(R.string.og_my_account_desc_meduim_length),
                      getContext().getString(R.string.og_my_account_desc_short_length),
                      chipWidth));
              viewTreeObserver[0] = myAccountView.getViewTreeObserver();
              if (viewTreeObserver[0].isAlive()) {
                viewTreeObserver[0].removeOnPreDrawListener(this);
              }
            }
            return true;
          }
        });
  }

  @VisibleForTesting
  String setChipTextWithCorrectLength(
      String longDesc, String mediumDesc, String shortDesc, int clipWidth) {
    if (!isTextEllipsized(longDesc, clipWidth)) {
      return longDesc;
    }
    if (!isTextEllipsized(mediumDesc, clipWidth)) {
      return mediumDesc;
    }
    return shortDesc;
  }

  private boolean isTextEllipsized(String text, int clipWidth) {
    TextPaint textPaint = myAccountView.getPaint();

    Toast.makeText(this.getContext(), "textPaint.measureText(text) = "+textPaint.measureText(text)+" clipWidth ="+ clipWidth,
        Toast.LENGTH_LONG).show();


    return textPaint.measureText(text) > clipWidth;
  }

当需要省略时,代码应动态更改textView中的文本。

然而,当我运行应用程序时,有时会看到视图(剪辑)宽度 == 长文本宽度,并且在UI中仍然有省略。

我发现这种情况发生在textView是不可见的并切换为可见时。

我应该以不同的方式计算vlip(视图)宽度吗?

在变得可见之前,有任何特殊的测量textView的方法吗?


requestLayout 方法应计算视图的位置和测量值。你试过了吗? - Ircover
2个回答

0

你应该检查一下

getEllipsisCount()

查看问题的源代码。

定义:返回要省略的字符数,如果不需要省略,则返回0。


但是我只能在太晚的阶段使用getEllipsisCount(),对吗?它什么时候可用?在onGlobalLayout(绘制后)中,对吗? - Elad Benda
你不能使用这个来确定为什么有时它不起作用吗? - kelalaka
在这里,https://dev59.com/0GYq5IYBdhLWcg3wtCko - kelalaka
在调用getEllipsisCount()之前,检查是否先调用textView.onRtlPropertiesChanged(0)可以解决问题吗? - Rahul

0

是的,您可以使用 textView.getLayout().getEllipsisStart(0),确保您的 textView 是单行的,您可以通过向 texView 添加 android:maxLines="1" 来实现。它返回文本被截断的索引,否则返回 0。

根据您的观察,可能是视图在将可见性再次更改为可见后没有重新计算,请尝试使用 textView.setVisibility(View.GONE) 而不是 textView.setVisibility(View.INVISIBLE);。这可能会导致再次调用 preDraw()

您还可以考虑使用 addOnGlobalLayoutListener() 来跟踪视图的可见性更改,有关 参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接