Ответ 1
Лучшее, что вы можете сделать, это использовать RecyclerView
с EditText
в качестве своего элемента, чтобы вы получили новый 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)
Лучшее, что вы можете сделать, это использовать RecyclerView
с EditText
в качестве своего элемента, чтобы вы получили новый EditText
для каждой из ваших строк.
Новая строка будет единственной вещью, которую вам придется реализовать.
Хотя в этой статье говорится только об оптимизации статических текстовых элементов, где текст не изменяется, это может привести вас к правильному пути для создания более эффективный EditText.
Избегайте использования EditText внутри RelativeLayout, вместо этого используйте LinearLayout.
Альтернативой может быть использование 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);
}
Очевидно, что это потребует большой работы, например, скрытия клавиатуры после этого, обработки обратного пространства и ввода и буфера обмена. Я как-то сформировал свой ответ на этот пост, вы можете попробовать другие методы, упомянутые там, если у вас возникли проблемы с извлечением клавиш клавиатуры. По их словам, приведенный выше код будет работать до тех пор, пока язык является английским.