【问题标题】:Check if textview is ellipsized in android检查textview是否在android中是椭圆的
【发布时间】:2013-03-12 03:01:46
【问题描述】:

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

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

        }

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

【问题讨论】:

标签: android textview ellipsis


【解决方案1】:

好吧,公认的解决方案确实有效,但会遗漏一些极端情况,因为它只会检查最后一行是否有省略号的字符。如果我们有一个由两行组成的 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;
}

不过,仍有改进的余地。但是这种方法确实足以满足我的用例。更正和改进表示赞赏。 :-)

【讨论】:

    【解决方案2】:

    使用 getEllipsisCount 不适用于其中包含空行的文本。我使用以下代码使其工作:

    message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
    
                if(m.isEllipsized == -1) {
                    Layout l = message.getLayout();
                    if (message.getLineCount() > 5) {
                        m.isEllipsized = 1;
                        message.setMaxLines(5);
                        return false;
                    } else {
                        m.isEllipsized = 0;
                    }
                }
                return true;
            }
        });
    

    确保不要在您的 XML 中设置 maxLineCount。然后你可以检查代码中的lineCount,如果它大于某个数字,你可以返回false取消TextView的绘制并设置行数以及一个标志来保存textView是否太长或不是。 textview 将使用正确的行数再次绘制,您将知道它是否带有标志的椭圆。

    然后您可以使用 isEllipsized 标志来执行您需要的任何操作。

    【讨论】:

    • 我假设 m.isEllipsized 只是在包含示例中代码块的类上设置的标志
    【解决方案3】:

    您可以使用此方法提供: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");
            } 
        } 
    }
    

    哪里可以通过getLineCount()获取线

    【讨论】:

    • 只是对你的文本视图的一个方法调用。添加了代码。 (未测试)
    • 这一定意味着您的文本视图尚未创建,或者如文档所述已进行了一些更改。您可以使用 textview1.post(new Runnable{}); 等待视图再次准备就绪;
    • getEllipsisCount() 方法有一个 int 参数。更新你的答案;)
    • @Calvin:我已经用椭圆测试的正确实现编辑了你的答案;)
    • 如果您的 getLayout() 返回 null,请使用 runnable。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多