4

我正在尝试设置一个包含两行文本的 TextView,第二行比第一行短。

有没有办法设置 TextView 的 Layout 实例(通过 TextView.getLayout() 获取)来截断第二行,还是有另一种我不知道的方法?

编辑 1

对我的意图有误解:我正在尝试以某种方式设置 textview 布局,我可以设置任意文本并根据长度发生以下情况:如果文本足够长以开始第二行,则制作第一行与 textview 的内容宽度一样宽的行,但第二行应该更短,例如宽度的一半。但是如果文本足够长,应该有第二行。

我检查了抽象类布局和它的子类,有一个功能

public int getLineEnd(int line)

返回一行最后一个字符的位置。一种方法是设置文本,然后检查第二行的布局宽度,然后将文本更改为更短的版本。无论如何,这似乎是一种 hacky 方式,如果我可以自己设置一个 Layout 实例(通过 setter 方法,例如 getter

TextView.getLayout().

有没有人将自定义布局设置为 Textview 的子类?

编辑 2 / 我自己的解决方案

找到了解决方案:现在我正在检查第二行是否与导致第二行变短的区域重叠。如果是这样,我将截断文本。我使用的功能:

TextView.getLineCount()
TextView.getLayout().getLineStart(int line)
TextView.getLayout().getLineEnd(int line)
TextView.getPaint().measureText()

也许这对任何人的未来都有帮助。

但是,如何设置自己的布局的问题仍然没有得到解答。

4

4 回答 4

0

我遇到了同样的问题,这是我的解决方案:


这是代码,用于计算文本长度和截断的 truncateText 方法。

public class LastLineControlTextView extends TextView{

private int mMaxLines;
private float mLastLineRatio = 0.5f;
private float mLastLineWidth;
private float mAllowLength;

public LastLineControlTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mLastLineWidth = getWidth()*mLastLineRatio;
    mAllowLength = (mMaxLines-1)*getWidth()+mLastLineWidth;
    if(!TextUtils.isEmpty(getText())){
        truncateText(getText());
    }
}

@Override
public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
    if(mAllowLength==0)
        return;
    truncateText(text);
}

@Override
public void setMaxLines(int maxlines) {
    super.setMaxLines(maxlines);
    mMaxLines = maxlines;
}

private void truncateText(CharSequence text){
    float width = Layout.getDesiredWidth(text, getPaint());
    int end = text.length();
    while(width > mAllowLength){
        width = Layout.getDesiredWidth(text, 0, end, getPaint());
        end--;
    }
    if(end==text.length())
        return;
    CharSequence processed = text.subSequence(0, end);
    System.out.println("end:"+end+"processed:"+processed);
    setText(processed);
}
}

于 2013-04-25T06:31:53.183 回答
0

尝试android:maxLines="1"在您的 XML 或textView.setMaxLines(1);Activity 中使用。

于 2012-08-21T15:31:33.010 回答
0

http://developer.android.com/reference/android/widget/TextView.html#attr_android:maxLines

使 TextView 最多有这么多行高。

必须是整数值,例如“100”。

这对应于全局属性资源符号 maxLines。

你也可以使用:

http://developer.android.com/reference/android/widget/TextView.html#attr_android:ellipsize

如果设置,会使长于视图宽度的单词变成椭圆而不是在中间断开。您通常还希望设置 scrollHorizo​​ntally 或 singleLine 以便整个文本也被限制为单行,而不是仍然允许被分成多行。

必须是以下常量值之一。

none start middle end marquee 这对应于全局属性资源符号ellipsize。

于 2012-08-21T15:33:20.757 回答
0

您可以使用“\n”来标记字符串中的不同行。并使用 TextView.setGravity() 方法来定义 TextView 的 Layout。例如,

mTextView.setText("Hello World Hello World\nSecond.");
mTextView.setGravity(Gravity.CENTER);

这个 TextView 的预览将是:

Hello World Hello World
        Second
于 2012-08-21T15:33:57.993 回答