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)
4 réponses
la meilleure chose à faire est d'utiliser RecyclerView
EditText
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.
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.
évitez D'utiliser EditText à L'intérieur D'unayout relatif, utilisez LinearLayout à la place.
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.