textview.getLineCount всегда 0 в Android - PullRequest
       0

textview.getLineCount всегда 0 в Android

31 голосов
/ 20 августа 2010

Я пытаюсь динамически изменить размер моего 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, а набор содержимого также ненулевой.

Кто-нибудь может помочь, пожалуйста?

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

Ответы [ 6 ]

74 голосов
/ 23 октября 2013

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

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.
    }
});
19 голосов
/ 05 февраля 2014

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

textView.post(new Runnable() {
    @Override
    public void run() {
        Log.v("Line count: ", textView.getLineCount()+"");
    }
});
18 голосов
/ 12 марта 2014

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

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

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

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

7 голосов
/ 20 августа 2010

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

1 голос
/ 10 августа 2017

на самом деле 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();
        }
0 голосов
/ 22 февраля 2011

Я создал класс 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's 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.       
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...