Android EditText alternative

A L'heure actuelle, L'EditText D'Android est extrêmement lent quand il s'agit d'une énorme quantité de lignes de texte (10000+). Il semble que ce ralentissement soit dû en partie au fait que EditText supporte les portées, et principalement au fait que EditText calcule la largeur de chaque ligne, ce qui est très coûteux. Existe-t-il des alternatives plus rapides à EditText, ou un moyen de l'optimiser pour le rendre utilisable?

EDIT: les traces de méthode sont les suivantes:

android.text.StaticLayout.generate: 99.1% CPU time inclusive, 8.8% exclusive (1 call)
    android.text.Layout.getParagraphSpans: 28% inclusive, 1.1% exclusive (4686 calls)
    android.text.MeasuredText.setPara: 20.6% inclusive, 1.6% exclusive (2343 calls)
    android.text.MeasuredText.addStyleRun: 18.6% inclusive, 1.1& exclusive (2343 calls)
    android.text.SpannableStringBuilder.getSpans: 15% inclusive (of parent calls), 56.7% inclusive (of all calls, 47.3% of which are from android.text.Layout.getParagraphSpans, 26% are from android.text.MeasuredText.setPara, 26% are from android.text.StaticLayout.generate)
18
demandé sur Zambezi 2015-04-23 17:49:21

4 réponses

la meilleure chose à faire est d'utiliser RecyclerViewEditText comme son élément, donc vous obtenez un nouveau EditText pour chacune de vos lignes.

Nouvelle ligne sera la seule chose que vous aurez à mettre en œuvre.

6
répondu Ilya Gazman 2016-03-23 06:55:06

bien que cet article ne parle que de l'optimisation de TextViews statiques où le texte ne change pas, il pourrait vous mettre sur la bonne voie pour faire un EditText plus performant.

1
répondu Andrew Orobator 2015-04-23 14:57:05

évitez D'utiliser EditText à L'intérieur D'unayout relatif, utilisez LinearLayout à la place.

-1
répondu Shailesh 2015-04-23 15:32:57

L'alternative serait d'utiliser un TextView (comment montrer le texte autrement) et le faire agir comme un EditText. Voici comment faire:

Vous serez mis un OnClickListener sur votre TextView, pour afficher le clavier:

textView.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        isEnteringText = true; //global
    }
});

Et remplacer onKeyDown et processus clavier presses de l'TextView:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(isEnteringText) {
        textView.append(event.getDisplayLabel());
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

évidemment, cela nécessitera beaucoup de travail, comme cacher le clavier par la suite, traiter backspace & enter, et le presse-papiers. J'ai en quelque sorte formé ma réponse autour de ce post, vous pouvez essayer les autres méthodes mentionnées si vous avez des problèmes pour récupérer les touches du clavier. Selon eux, le code ci-dessus va travailler aussi longtemps que la langue est l'anglais.

-1
répondu Aaron Gillion 2017-05-23 12:33:29