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