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

来源:互联网 发布:东软医保软件收费 编辑:程序博客网 时间:2024/05/17 07:34

代码如下:


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已经正确显示在屏幕上)。

 


1 0
原创粉丝点击