textView动态更改为较短的文本,而不是省略号

时间:2018-09-13 15:03:18

标签: android user-interface textview width android-viewtreeobserver

我有此代码:

  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;
  }

当需要使用ellipsize时,代码应动态更改textView中的文本。

但是,当我运行应用程序时,有时会看到视图(剪辑)宽度==长的文本宽度,并且UI中仍然存在椭圆大小。

我看到当textView为not visible并切换为visible时会发生这种情况。

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

有没有什么特殊的方法可以测量textView成为visible

2 个答案:

答案 0 :(得分:0)

您应使用

进行检查
getEllipsisCount()

查看问题的根源。

定义:返回要省略的字符数,如果没有省略号,则返回0。

答案 1 :(得分:0)

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

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

对于reference,您可能还考虑使用addOnGlobalLayoutListener()来跟踪视图的可见性变化。