检查textview是否在android中进行了椭圆化处理

use*_*569 16 android ellipsis textview

我的TextView宽度为wrap content.在这个TextView我设置文本,但文本每次都不是相同的长度.当文本很长时,我使用单行true和ellipsize:end.但现在我有一个问题.我想设置其他布局的可见性,但这取决于我的文本的长度.如果文本太长而无法放入屏幕我想setVisible为true,但是当文本很短并且我不需要ellipsize时,我想将可见性设置为false.所以我需要检查TextView的状态.当它的椭圆形时我想要setVisible真实,当它不是setVisible假的.我怎么能这样做 这就是我得到的:

tvAle.post(new Runnable() {

        @Override
        public void run() {

            int lineCount    = tvAle.getLineCount();
            Paint paint =  new Paint();
            paint.setTextSize(tvAle.getTextSize());
            final float size = paint.measureText(tvAle.getText().toString());
            Log.v("a", ""+size+" "+tvAle.getWidth());
            if ((int)size > (tvAle.getWidth()+10)) {
                allergiesLayout.setVisibility(View.VISIBLE);
            }

            else
                allergiesLayout.setVisibility(View.GONE);

        }
Run Code Online (Sandbox Code Playgroud)

但这个解决方案不起作用.

Cal*_*vin 56

您可以使用以下提供的方法:getEllipsisCount

Layout layout = textview1.getLayout();
if(layout != null) {
    int lines = layout.getLineCount();
    if(lines > 0) {
        int ellipsisCount = layout.getEllipsisCount(lines-1);
        if ( ellipsisCount > 0) {
            Log.d(TAG, "Text is ellipsized");
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

可以通过getLineCount()获取行

  • 当文本包含"\n"时,它不起作用 (7认同)
  • 这必然意味着您的textview尚未创建,或者正如文档所说,已经进行了一些更改.您可以使用textview1.post(new Runnable {})等待视图再次准备就绪; (3认同)
  • `getEllipsisCount()`方法有一个int参数.更新你的答案;) (3认同)
  • @Houcine更新.:) (2认同)

Sam*_* Rö 12

好吧,接受的解决方案确实有效,但是错过了一些极端情况,因为它只会检查椭圆化字符的最后一行.如果我们有一个由两行组成的TextView并使用TruncateAt.START截断文本的开头,则接受的答案将失败.: - /

添加ViewTreeObserver.OnPreDrawListener对我来说似乎更像是一个非常昂贵的开销.所以我对接受的答案的代码做了以下改进:

/**
 * Checks if the text of the supplied {@link TextView} has been ellipsized.
 *
 * @param textView
 *         The {@link TextView} to check its text.
 *
 * @return {@code True} if the text of the supplied {@code textView} has been ellipsized.
 */
public static boolean isTextViewEllipsized(final TextView textView) {
    // Check if the supplied TextView is not null
    if (textView == null) {
        return false;
    }

    // Check if ellipsizing the text is enabled
    final TextUtils.TruncateAt truncateAt = textView.getEllipsize();
    if (truncateAt == null || TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) {
        return false;
    }

    // Retrieve the layout in which the text is rendered
    final Layout layout = textView.getLayout();
    if (layout == null) {
        return false;
    }

    // Iterate all lines to search for ellipsized text
    for (int line = 0; line < layout.getLineCount(); ++line) {

        // Check if characters have been ellipsized away within this line of text
        if (layout.getEllipsisCount(line) > 0) {
            return true;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,仍有改进的余地.但是这种方法足以满足我的用例.我们赞赏更正和改进.:-)