Подтвердить что ты не робот

Альтернатива Android EditText

В настоящее время Android EditText чрезвычайно медленный, имея дело с огромным количеством строк текста (10000+). Похоже, что это замедление частично связано с тем, что EditText поддерживает интервалы, и в первую очередь из-за того, что EditText вычисляет ширину каждой строки, что очень дорого. Есть ли какие-либо более быстрые альтернативы EditText или способ его оптимизации, чтобы сделать его пригодным для использования?

EDIT: Трассировка метода выглядит следующим образом:

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)
4b9b3361

Ответ 1

Лучшее, что вы можете сделать, это использовать RecyclerView с EditText в качестве своего элемента, чтобы вы получили новый EditText для каждой из ваших строк.

Новая строка будет единственной вещью, которую вам придется реализовать.

Ответ 2

Хотя в этой статье говорится только об оптимизации статических текстовых элементов, где текст не изменяется, это может привести вас к правильному пути для создания более эффективный EditText.

Ответ 3

Избегайте использования EditText внутри RelativeLayout, вместо этого используйте LinearLayout.

Ответ 4

Альтернативой может быть использование TextView (как еще вы могли бы показать текст) и заставить его действовать как EditText. Вот как:

Вы установите OnClickListener в TextView, чтобы отобразить клавиатуру:

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

И переопределить onKeyDown и обработать нажатия клавиш в TextView:

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

Очевидно, что это потребует большой работы, например, скрытия клавиатуры после этого, обработки обратного пространства и ввода и буфера обмена. Я как-то сформировал свой ответ на этот пост, вы можете попробовать другие методы, упомянутые там, если у вас возникли проблемы с извлечением клавиш клавиатуры. По их словам, приведенный выше код будет работать до тех пор, пока язык является английским.