web-dev-qa-db-fra.com

textview.getlinecount toujours 0 in android

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.

35
neha

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

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()+"");
    }
});
21
Nima K

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.

21
Nativ

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

7
DeRagan

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

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