大家都遇到过项目中需要获控件的的高度或者列如文章开头说TextView的行数 但是很多人在实际操作中getLineCount()获取到值是零,其实只是我们没在正确的位置获取。
这是因为activtiy的onCreate()时候view 还没渲染完成,和view的生命周期有关 在onCreate()设置contentview其实是用Pull解析XML绘出到activity上的 很多开发很久的人绝对对view 不陌生, 这里就不对view做详细说明 ,因为这说起来十几篇都说不完, 只要知道在onCreate()时候view只是在做控件的大小测量,和布局排版就可以了 ,具体绘制时间不定时 有可能onResume() 就完成了 有可能上个周期绘制完成 具体可去看下view的详解一书
那么问题来了 怎么解决上诉问题呢
方法一 :
那么就在onCreate()里开启异步操作,先上代码
tv_content.post(new Runnable() { @Override public void run() { oldlines = tv_content.getLineCount(); } });
通过此代码就可以等到绘制完成的接口回调
方法二:
自定义一个AsyncTask类 ,重写方法即可
privateclassMyOpenTask extendsAsyncTask<Integer, Integer, Integer> { privateint[] location = newint[2]; @Override protectedvoidonCancelled() { super.onCancelled(); } publicvoidstart() { execute(0); } @Override protectedInteger doInBackground(Integer... params) { return1; } @Override protectedvoidonPostExecute(Integer result) { super.onPostExecute(result); intlinecount = mVideoDescription.getLineCount(); //这里就可以拿到行数做判断 具体看你做什么操作了 }
}
通过以上两个方法 大家可能感觉第一个方便 其实第一个也是对第二个方法的封装,
看过AsyncTask源码的人都知道 他就封装了handle,总之获取行数开启线程用异步
方式获取绘制完成高度的接口回调。如果想搞懂原理 大家可以去看AsyncTask源码浅析。