【问题标题】:Android EditText alternativeAndroid EditText 替代品
【发布时间】:2015-04-23 14:49:21
【问题描述】:

目前,Android 的 EditText 在处理大量文本(10000+)时非常慢。看起来这种放缓部分是由于 EditText 支持跨度,主要是由于 EditText 正在计算每行的宽度,这非常昂贵。有没有比 EditText 更快的替代品,或者有什么方法可以优化它以使其可用?

编辑:方法跟踪如下:

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)

【问题讨论】:

  • 这也是我正在探索的一个问题。我的帖子提供了一些解决方案(尽管没有一个是足够的)我提出并测试了:stackoverflow.com/questions/29801232/…
  • 也许你可以设置singleLine="true" 这样它就不必渲染线宽了?在您滚动之前,它也不会渲染任何超出边距的内容,至少它不应该
  • @AaronGillion 确实提高了性能(尽管仍然没有达到可用的水平),但是它不允许进行多行编辑,这是我需要的。
  • 试试 android:hardwareAccelerated="false"。它可能是出于 EditText 的能力。
  • EditText 不是为这个用例设计的。它是为输入几行文本而设计的。您需要为此创建一个自定义视图。这真的不应该让您感到惊讶,您认为文字处理器使用 Windows 中的内置文本工具吗?如果你有一个极端的用例,你需要自己做更多的工作。

标签: android performance android-edittext textview


【解决方案1】:

您可以做的最好的事情是使用RecyclerViewEditText 作为它的项目,这样您的每行都会得到一个新的EditText

新行将是您必须实施的唯一事情。

【讨论】:

  • 有人测试过吗?与 EditText 相比,它在性能和用户交互方面的表现如何?实施起来难吗?
  • 无论你做什么,都很难实现……但是性能很震撼!
  • 您知道这里没有推荐的更新替代方案吗?我看到像 QuickEdit 这样的应用程序,其编辑器的性能甚至超过 30k 行,而且它们显然没有使用 recyclerview
  • 我用类似的方法滚动整个bible
  • 那不是文本视图,还是您的圣经可编辑?但是您知道这些应用程序是如何做到的吗?
【解决方案2】:

虽然this article 只讨论优化文本不变的静态 TextView,但它可能会让您走上正确的轨道,以制作更高效的 EditText。

【讨论】:

    【解决方案3】:

    避免在 RelativeLayout 中使用 EditText,而是使用 LinearLayout。

    【讨论】:

    • 不幸的是,它根本不喜欢这有帮助。在这种情况下 - 我尝试设置固定的宽度和高度,但仍然没有出现明显的差异。
    • 你能检查一下 DDMS 是否有很多重绘和重新计算发生
    • 您也可以确认正在运行的操作系统版本以进行测试
    • 我正在运行 Android 5.0,并且似乎无关紧要哪个硬件(尝试了多个)。稍后我将使用方法跟踪更新我的 OP。
    【解决方案4】:

    替代方法是使用TextView(否则您将如何显示文本)并使其充当EditText。方法如下:

    您将在 TextView 上设置 OnClickListener,以显示键盘:

    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);
    }
    

    显然这需要做很多工作,例如隐藏键盘、处理退格和回车以及剪贴板。我在this post 周围形成了我的答案,如果您在检索键盘键时遇到问题,可以尝试其中提到的其他方法。据他们说,只要语言是英语,上面的代码就可以工作。

    【讨论】:

    • EditText 是 “TextView 的薄薄的一层”。真正的问题在于 TextView,即使问题是关于 EditText。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多