软键盘重绘性能问题

时间:2014-12-31 20:11:41

标签: android

我遇到一个奇怪的问题,某些手机与谷歌/三星的键盘不同,我想知道是否有人遇到并有解决方案。

我遇到的问题是:如果我使用股票谷歌或三星galaxy的键盘,我的布局(下面)表现良好,是活泼的,没有任何滞后。我在许多设备(Galaxy S3,Galaxy Note,Galaxy S5,Nexus 5,6和7)上进行了测试。另一方面,如果我使用默认键盘在HTC或LG手机上运行此功能,则当用户输入文本时,布局会出现明显的延迟。

经过大量的调试和性能测量后,我发现问题出在建议栏上。对于默认的Samsung / Google键盘,建议栏始终存在(如下所示),但对于HTC / LG手机,只有在用户输入导致重新渲染布局的内容后,建议栏才会显示。当用户开始键入时,这种重新渲染反过来会导致明显的延迟。我已经尝试了很多这样的解决方案,例如在LinearLayout中包装我的布局并修复它们的宽度(通过指定权重)和修复其他控件的高度等(在下面的布局文件中都可见)以便删除测量布局测量的负担,但没有一个消除这种滞后。

我的问题是,我该如何解决这个问题?是否有办法强制所有键盘始终显示此建议栏,而不管用户输入的文本是否可能存在或不存在?我强迫用户选择一个特定的键盘,或者他们面临相当大的延迟,这不是一个真正的选择。

Google keyboard suggestion bar

我的布局是一个简单的布局,带有水平滚动视图和两个编辑文本:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:text="@string/editText_topic"
        android:textSize="@dimen/txt_description_font_size" />

    <HorizontalScrollView
        android:id="@+id/layout_topics"
        android:layout_width="match_parent"
        android:layout_height="@dimen/gallery_height"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="2dp"
        android:background="@drawable/rectangle_error_background"
        android:paddingLeft="6dp"
        android:paddingRight="6dp" >

        <LinearLayout
            android:id="@+id/gallery_topic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:orientation="horizontal" />
    </HorizontalScrollView>

    <RelativeLayout
        android:id="@+id/layout_title_text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp" >

        <TextView
            android:id="@+id/txt_title_length"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:textSize="@dimen/length_text_font_size" >
        </TextView>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/txt_title"
            android:layout_width="0dp"
            android:layout_height="@dimen/txt_input_height"
            android:layout_gravity="fill_horizontal|fill_vertical"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:hint="@string/editText_title_hint"
            android:inputType="textFilter|textCapSentences" >

            <requestFocus
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </EditText>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/layout_description_text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp" >

        <TextView
            android:id="@+id/txt_description_length"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:textSize="@dimen/length_text_font_size" >
        </TextView>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/txt_content"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="top|left"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:gravity="top"
            android:hint="@string/editText_description_hint"
            android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
            android:scrollbars="vertical" >
        </EditText>
    </LinearLayout>
</LinearLayout>

清单中的活动是:

    <activity
        android:name="MyActivity"
        android:icon="@drawable/whatever"
        android:label="@string/empty"
        android:parentActivityName="ParentActivity"
        android:theme="@style/MyTheme"
        android:windowSoftInputMode="adjustResize|stateVisible" >
    </activity>

更新 我注意到WhatsApp总是在键盘上显示这个建议栏,即使EditText的输入为空(用户尚未输入值)。有谁知道这是怎么做的?

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

没有办法强迫它。这是必须在键盘侧完成的事情,因为键盘决定何时显示候选视图。事实上,这个性能问题是我工作的几个键盘上的一个原因,我们没有使用Android内置的candidateView功能并自行推出。

答案 1 :(得分:0)

以下设置将隐藏建议栏。但是,我不知道强制它显示的设置。

android:inputType="textNoSuggestions"
android:inputType="textFilter"