在android中textview.getLineCount总是0

我试图dynamic调整我的textview,但getlinecount()方法总是返回我0即使在settext()和invalidate()之后。 我使用下面的代码:

if(convertView == null){ convertView = lInflater.inflate(R.layout.listview, null); holder = new ViewHolder(); holder.text2 = (TextView)convertView.findViewById(R.id.TextView02); convertView.setTag(holder); } else{ holder = (ViewHolder)convertView.getTag(); } holder.text2.setText(arr2[position]); holder.text2.invalidate(); int lineCnt = holder.text2.getLineCount(); 

持有者是一个静态类如下:

  static class ViewHolder{ TextView text2; } 

持有者包含非空text2,内容集也非空。

任何人都可以帮忙吗?

提前感谢。

Solutions Collecting From Web of "在android中textview.getLineCount总是0"

我知道这个问题是相当古老的,但如果有人来这里寻找实际的答案:

 holder.text2.setText(arr2[position]); holder.text2.post(new Runnable() { @Override public void run() { int lineCnt = holder.text2.getLineCount(); // Perform any actions you want based on the line count here. } }); 

它应该通过post方法在UI Thread上完成。

 textView.post(new Runnable() { @Override public void run() { Log.v("Line count: ", textView.getLineCount()+""); } }); 

为了解决这个问题,应用以下几行:

 textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (textView.getLineCount() > 1) { textView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }); 

OnGlobalLayoutListener将在每次对TextView更改后调用(在测量之后绘制它)。 在这里你可以捕捉到你的TextView变化,然后将其绘制到屏幕上,并做任何你需要的东西。

代码的最后一行是删除监听器,这很重要,因为我们不想继续捕捉每个布局更改。

getLineCount()只会在布局过后给你正确的行数。 这意味着TextView必须至less绘制一次。 我假设在这个时间你的Textview没有绘制,因此你得到0作为行数

我做了一个asynctask类,并在其onPostExecute方法中执行了与getLineCount()相关的任务。

 protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new myAsyncTask().execute(null, null, null); } private class myAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(final Void... params) { // It's okay to leave this as it is return null; } @Override protected void onPostExecute(final Void result) { super.onPostExecute(result); //DO YOUR TASK HERE, getLineCount(), etc. } } 

实际上TextView.getLineCount()依赖于TextView.mLayout.getLineCount,但TextView.mLayout是在onMeasure之前的惰性init,你可以这样做:

  if (holder.contentTV.getLayout() == null) { holder.contentTV.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { holder.contentTV.getLineCount(); holder.contentTV.getViewTreeObserver().removeOnPreDrawListener(this); return true; } }); } else { holder.contentTV.getLineCount(); }