您的位置:首页 > 其它

获取TextView每行的内容 (涉及getLineCount为0,getLineEnd问题)

2015-05-12 17:02 537 查看
代码如下:

class LineContent inplements Runnable
{
private TextView mTarget;

public LineContent(TextView target)
{
mTarget = target;
}

public void run()
{
GetEachLineContent();
}

private void GetEachLineContent()
{
//得到TextView的布局
Layout layout = mTarget.getLayout();
//得到TextView显示有多少行
int lines = mTarget.getLineCount();
//为了转换String 到 StringBuilder
StringBuilder SrcStr = new StringBuilder(mTarget.getText().toString());

for(int i = 0; i < lines ; i++)
{
//使用getLineStart 和 getLineEnd 得到指定行的开始和结束的坐标,坐标范围是SrcStr整个字符串范围内。
String lineStr = SrcStr.subSequence(layout.getLineStart(i),Layout.getLineEnd(i)).toString();
Log.d("text",lineStr);
}
}
}

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
RelativeLayout relativeLayout = new RelativeLayout(this);

TextView textview = new TextView(this);
String string = new String("fsda sf-\n>123sdfasdf\n1232132\n1321");
textView.setText(string);
relativeLayout.addView(textView);

setContentView(relativeLayout);

textView.post(new LineContent(textView));
}


解释:

1.为什么要用post方法来做?

原因1: 因为getLineCount()要返回正确的行数,必须是TextView已经成功绘画到屏幕上。否则我们可以试验不用post直接在oncreate调用,getLineCount就会返回0。

原因2: getLineStart() 和 getLineEnd() 这两个函数是得到已经绘画在屏幕上TextView中的行和尾的坐标(在整个TextView中字符串的范围内),所以如果TextView

还没有绘画到屏幕上,我们怎么可能能得到每行的开始和结束下标。

(因为字体大小,布局方式,换行符(\n),都会影响每行的内容,所以行数多少和开始结束下标,都必须等到TextView已经正确显示在屏幕上)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: