項目中發現,如果直接通過TextView.getLineCount()方法獲取行數時,總是0,研究發現,setText()后立即調用getLineCount(),
這時TextView還未完成measure,要想正確的獲取TextView的行數有兩種方法
1.用ViewTreeObserver監聽View初始化的各種狀態
使用ViewTreeObserver的OnPreDrawListener在TextView完成測量和定位即將繪制時調用getLineCount()即可得到TextView的真實行數,代碼如下:
tv_test.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { //這個回調會調用多次,獲取完行數記得注銷監聽 tv_test.getViewTreeObserver().removeOnPreDrawListener(this); LogUtils.e("TextView 行數:" + tv_test.getLineCount()); return false; } }); tv_test.setText("老人取件發現“巨獎” 將計就計反忽悠騙子老人取件發現“巨獎”");
注意紅框部分。
2.View.post(Runnable r)方法
代碼如下:
tv_test.post(new Runnable() { @Override public void run() { LogUtils.e("行數:"+tv_test.getLineCount()); } }); tv_test.setText("老人取件發現“巨獎” 將計就計反忽悠騙子老人取件發現“巨獎”");
這個Runnable會被添加到一個順序執行的UI事件隊列,等執行到里面的代碼時,View已經完成了measure和layout等一系列
初始化工作,所以可以正確獲取到View的高度等信息