2010-08-20 43 views
22

Estoy intentando cambiar el tamaño de mi vista de texto de forma dinámica, pero el método getlinecount() siempre me devuelve 0 incluso después de settext() e invalidar(). Estoy utilizando el siguiente código:textview.getLineCount siempre 0 en android

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

titular es una clase estática de la siguiente manera:

static class ViewHolder{ 
     TextView text2; 
} 

titular contiene texto2 no nulo y el conjunto de contenido también es no nula.

¿Alguien puede ayudarnos?

Gracias por adelantado.

Respuesta

7

getLineCount() le dará la cantidad correcta de líneas solo después de un pase de disposición. Eso significa que TextView debe haberse dibujado al menos una vez. Supongo que en este momento tu Textview no está dibujado, por lo tanto obtienes 0 como el recuento de líneas

+0

Gracias Rahul .. Así es, pero me Me temo dónde establecer esta altura, incluso si no después de setText(). – neha

+0

No estoy seguro de dónde se ha colocado este código a partir de ahora. Pero si lo ha colocado en getview, el texto se muestra/dibuja solo después de devolver el objeto de vista para esa posición – DeRagan

1

Realicé una clase asynctask e hice mis tareas getLineCount() en su método 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.  
    } 
} 
+0

Nota para los votantes a la baja: un comentario sería útil. –

+7

Si hay votos bajos, probablemente porque el uso de un temporizador para esperar a que se complete el diseño es arriesgado, ya que no hay garantía de que el diseño se complete cuando se ejecute la tarea asíncrona. Mirar los eventos relacionados con el diseño/dibujo sería mejor (todavía no tengo ningún código o lo publicaría). – eselk

63

Sé que esta pregunta es bastante antiguo, pero en caso de que alguien viene aquí en busca de la respuesta real:

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

buena manera. Gracias – user1755546

+0

esto funcionó para mí también –

+1

También TextView debe ser VISIBLE o INVISIBLE para este método. Cuando se HA IDO, no funciona. –

16

se debe hacer en el hilo de interfaz de usuario mediante el método POST.

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

Con el fin de solucionar este problema se aplicarán las siguientes líneas:

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

El OnGlobalLayoutListener se llamará después de cada cambio en el TextView (después de medirla, dibujándolo, ..). Aquí puede ver cambios en su TextView antes de que se dibuje en la pantalla y haga lo que necesite con él.

La última línea del código es eliminar el oyente, es importante ya que no queremos seguir detectando cada cambio de diseño.

+0

¿Qué es 'mediaAtomLayout'? – ericn

+0

Supongo que mediaAtomLayout aquí representa nuestra vista de texto – cammando

+0

@cammando, tienes razón, acabo de arreglarlo. – Nativ

0

realidad TextView.getLineCount() se basan en TextView.mLayout.getLineCount pero TextView.mLayout es perezosa init antes onMeasure, puede hacerlo de esta manera:

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