J'essaie de redimensionner de manière dynamique ma méthode TextView mais getlinecount () me renvoie toujours 0 même après Settext () et invalider (). J'utilise le code suivant:
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();
le titulaire est une classe statique comme suit:
static class ViewHolder {
TextView text2;
}
le support contient non NULL Text2 et le jeu de contenu est également non null.
Quelqu'un peut-il aider?
Merci à l'avance.
Je sais que cette question est assez ancienne, mais au cas où n'importe qui vient ici à la recherche de la réponse réelle:
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.
}
});
Il devrait être fait sur le fil de l'interface utilisateur par la méthode postale.
textView.post(new Runnable() {
@Override
public void run() {
Log.v("Line count: ", textView.getLineCount()+"");
}
});
Pour résoudre ce problème, appliquez les lignes suivantes:
textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (textView.getLineCount() > 1) {
textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
Le OnGlobalLayoutListener
sera appelé après chaque passage au TextView
(après la mesurer, le dessin, ..). Ici, vous pouvez attraper des modifications à votre TextView
avant qu'il ne soit dessiné à l'écran et faire tout ce dont vous avez besoin avec elle.
La dernière ligne du code consiste à supprimer l'auditeur, il est important car nous ne voulons pas continuer à attraper chaque changement de mise en page.
getLinCount () vous donnera le nombre correct de lignes qu'après une passe de mise en page. Cela signifie que la vue textuelle doit avoir été dessinée au moins une fois. Je suppose qu'à ce moment-là, votre TextView n'est pas dessinée d'où vous obtenez 0 comme le compte de ligne
en fait textview.getlinecount () s'appuyer sur textview.mlayout.getlinecount mais textview.mlayout est paresseux init avant OnMeasure, vous pouvez faire comme ceci:
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();
}
J'ai fait une classe d'asyncaste et j'ai fait mes tâches liées à la gislinecount () dans sa méthode surpostextecute.
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.
}
}