TextView中可以设置多少文本,才不需要滚动?

4

有一个特定的文本字符串,使用特定的字体和大小,TextView 中可以设置多少文本,以便TextView不需要滚动。我的意思是,在不需要滚动的情况下,可以适合多少文本在TextView中。 这类似于如何确定Android中TextView中适合多少文本?,但我找不到可行的解决方案。请帮忙。

4个回答

1
假设您已经寻找了其他选项,但没有简单的方法来实现这一点,下面是一个理论上的(我没有测试过)hackish方法,可能会起作用。
创建一个扩展TextView的新类。然后,覆盖一个在TextView内容更新后调用的方法。可能有更好的方法可用,但为了这个例子,让我们尝试使用onDraw()。这个方法将检查宽度并查看是否需要滚动。如果需要,它将修剪字符串并设置文本。它将在循环中执行此操作,直到不再需要滚动为止。
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if(getWidth() < computeHorizontalScrollRange()){
        // Requires scrolling, the string is too long

        // Do whatever you need to do to trim the string, you could also grab the remaining string and do something with it.

        // Set the TextView to use the trimmed string.
    }

}

你需要确保它不会进入无限循环,并检查宽度是否为零。

你还可以查看各种android:ellipsize选项。


它可以工作,我使用了高度而不是宽度。但仍在寻找更好的答案。毕竟,多次更改文本并不是最佳选择。 - Priyank Bolia
好的,这个方法存在问题,我无法将其剪切到单词边界。 - Priyank Bolia

1

我实际上需要类似的东西。我需要一个半固定大小的TextView,但文本始终需要适合其中。由于大小并不重要,我创建了一个视图,直到文本适合为止,才更改文本大小。

import android.content.Context;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;

/**
 * The text inside this TextView will resize to fit. 
 * It will resize until it fits within the view and padding
 */
public class FitTextView extends TextView {
private float defaultSize = 12;

public FitTextView(Context context) {
    super(context);
}

public FitTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    defaultSize = getTextSize();
}

public FitTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    defaultSize = getTextSize();
}   

/**
 * Set the default size. This size is set every time the 
 * view is resized.
 * @param size
 */
public void setDefaultSize(float size) {
    defaultSize = size;
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultSize);
    fitCharsInView();

    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
public void setText(CharSequence text, BufferType type) {
    fitCharsInView();
    super.setText(text, type);
}

/**
 * Decreases the text size until it fits inside the view
 */
public void fitCharsInView() {
    int padding = getPaddingLeft() + getPaddingRight();
    int viewWidth = getWidth() - padding;
    float textWidth = getTextWidth();

    int iKillInfite = 0;
    int maxIteration = 10000;
    while(textWidth > viewWidth && iKillInfite < maxIteration) {
        iKillInfite++;
        float textSize = getTextSize();

        setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize-1);
        textWidth = getTextWidth();
    }
}

/**
 * Gets the width in pixels of the text
 * @return
 */
private float getTextWidth() {
    return getPaint().measureText(getText().toString());
}
}  

0

这只是我的一个快速头脑风暴:

  1. 测量字符长度
  2. 获取屏幕尺寸和密度信息
  3. 获取字体大小、行高
  4. 根据上述数据计算给定字符串将占用的大致空间量
  5. 相应地拆分字符串

如何做到,如果您看一下问题,我已经尝试了其他问题链接中提出的方式,这与您的方式相同。 - Priyank Bolia

0

我会扩展TextView类,并覆盖onLayout()方法,将字符串截取,只要测量高度大于computeHorizontalScrollRange()

我认为这个解决方案更好,因为:

  1. 它只截取一次文本(当视图被创建时);
  2. 如果想在将来还原文本,则可以轻松存储“已截取”的文本;
  3. OOP是很棒的。

还没有尝试过,但我认为它不会起作用,因为你如何找到要修剪的确切大小。布局方法只会被调用一次。 - Priyank Bolia
您不会找到确切的尺寸来进行修剪:您需要迭代直到它达到正确的尺寸。 - goncalossilva

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