textview.getLineCount在android中始终为0

neh*_*eha 32 android textview

我正在尝试动态调整我的textview,但getlinecount()方法总是在settext()和invalidate()之后返回0.我正在使用以下代码:

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();
Run Code Online (Sandbox Code Playgroud)

holder是一个静态类,如下所示:

static class ViewHolder {
    TextView text2;
}
Run Code Online (Sandbox Code Playgroud)

holder包含非null text2,内容集也为非null.

有人可以帮忙吗?

Thanx提前.

Sco*_*ott 75

我知道这个问题已经很老了,但是如果有人来这里寻找实际的答案:

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.
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 对于此方法,TextView也需要是VISIBLE或INVISIBLE.当它的GONE,它不起作用. (3认同)

Nat*_*tiv 21

要解决此问题,请应用以下行:

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

OnGlobalLayoutListener会每次更改后的调用TextView(测量它,它拉..后).在这里,你可以TextView在它被吸引到屏幕之前捕捉你的变化,并用它做你需要的任何事情.

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


Nim*_*a K 19

它应该在UI Thread by post方法上完成.

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


DeR*_*gan 7

只有布局通过后,getLineCount()才能为您提供正确的行数.这意味着TextView必须至少绘制一次.我假设在这个时间点你的Textview没有被绘制,因此你得到0作为行数