安卓获取View的高度或TextView的行数

     大家都遇到过项目中需要获控件的的高度或者列如文章开头说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源码浅析。

你可能感兴趣的:(安卓获取View的高度或TextView的行数)