Подтвердить что ты не робот

Textview.getLineCount всегда 0 в android

Я пытаюсь динамически изменить размер моего 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;
}

Держатель содержит ненулевой текст2, а набор содержимого также не равен нулю.

Кто-нибудь может помочь?

Спасибо заранее.

4b9b3361

Ответ 1

Я знаю, что этот вопрос довольно старый, но в случае, если кто-то приходит сюда, ища фактический ответ:

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.
    }
});

Ответ 2

Это должно быть сделано в потоке пользовательского интерфейса по почте.

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

Ответ 3

Чтобы исправить эту проблему, примените следующие строки:

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

OnGlobalLayoutListener будет вызываться после каждого изменения в TextView (после его измерения, рисуя его,..). Здесь вы можете уловить изменения в TextView, прежде чем он будет нарисован на экране и сделает все, что вам нужно.

Последняя строка в коде - удалить слушателя, это важно, так как мы не хотим продолжать перехватывать каждое изменение макета.

Ответ 4

getLineCount() даст вам правильное количество строк только после прохода макета. Это означает, что TextView должен был нарисоваться хотя бы один раз. Я предполагаю, что в этот момент ваш Textview не будет отрисован, поэтому вы получаете 0 в качестве количества строк

Ответ 5

Фактически TextView.getLineCount() полагается на TextView.mLayout.getLineCount но TextView.mLayout - это ленивый init перед onMeasure, вы можете сделать вот так:

       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();
        }

Ответ 6

Я создал класс asynctask и выполнил мои задачи, связанные с getLineCount(), в методе onPostExecute.

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 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.       
    }
}