我正在尝试设置包含两行文本的TextView,第二行比第一行短。
有没有办法设置TextView的Layout实例(通过TextView.getLayout()获取)来截断第二行,还是有另一种我不知道的方式?
编辑1
我的意图有误解:我试图设置一种文本视图,我可以设置任意文本,并根据长度发生以下情况: 如果文本足够长以开始第二行,则使第一行与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()
也许这有助于未来的任何人。
但是,如何设置自己的布局仍然没有答案。
答案 0 :(得分:0)
尝试在XML中使用android:maxLines="1"
或在您的活动中使用textView.setMaxLines(1);
。
答案 1 :(得分: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
如果设置,则会导致比视图宽的单词 椭圆化而不是在中间破碎。你经常也会想要 设置scrollHorizontally或singleLine以使文本为 整体也被限制在一条线而不是仍被允许 分成多行。
必须是以下常量值之一。
无启动中端选框这对应于 全局属性资源符号ellipsize。
答案 2 :(得分:0)
您可以使用“\ n”标记字符串中的不同行。并使用TextView.setGravity()方法定义TextView的布局。例如,
mTextView.setText("Hello World Hello World\nSecond.");
mTextView.setGravity(Gravity.CENTER);
此TextView的预览将是:
Hello World Hello World
Second
答案 3 :(得分: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);
}
}