support studio diseƱo constraintlayout constraint android performance android-edittext android-textview

studio - Android EditText alternativa



android support constraint constraintlayout (4)

Aunque este artículo solo habla sobre la optimización de las vistas de texto estáticas en las que el texto no cambia, podría llevarlo por el camino correcto para hacer un texto de edición más eficaz.

Actualmente, el EditText de Android es extremadamente lento cuando se trata de una gran cantidad de líneas de texto (más de 10000). Parece que esta desaceleración se debe en parte al hecho de que EditText admite intervalos, y principalmente al hecho de que EditText está calculando el ancho de cada línea, lo cual es muy costoso. ¿Hay alternativas más rápidas a EditText, o una manera de optimizarlo para que sea utilizable?

EDITAR: los rastros del método son los siguientes:

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)


Evite usar EditText dentro de un RelativeLayout, use LinearLayout en su lugar.


La alternativa sería utilizar un TextView (¿de qué otra manera se mostraría el texto) y hacerlo actuar como un texto de EditText ? Así es cómo:

Configurarás un OnClickListener en tu TextView para mostrar el teclado:

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

Y anule onKeyDown y procese las pulsaciones del teclado en TextView:

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

Obviamente, esto requerirá mucho trabajo, como ocultar el teclado después, procesar el retroceso y la entrada, y el portapapeles. Formulé mi respuesta alrededor de esta publicación , puedes probar los otros métodos mencionados allí si tienes problemas para recuperar las teclas del teclado. Según ellos, el código anterior funcionará siempre que el idioma sea el inglés.


Lo mejor que puedes hacer es usar RecyclerView con EditText como su elemento, para que obtengas un nuevo EditText para cada una de tus líneas.

La nueva línea será lo único que tendrás que implementar.