显示或隐藏应用软键盘时,Android应用会冻结

时间:2019-08-15 09:22:40

标签: android android-edittext android-softkeyboard

我有一个有片段的活动。在该片段内,ViewPager内有5个fragmnet。每个片段都有30多个输入字段,包括EditTexts,自定义Dropdowns和Date Pickers或嵌套的ViewPagers,其中片段具有相同数量的输入字段。 问题是;当用户点击任何EditText输入数据时,软键盘将变为可见,而当其完全可见时,该应用程序将冻结约2秒钟。当用户按下“后退”按钮隐藏软键盘时,键盘从屏幕上移开,并且软键盘下方的屏幕区域变为白色,并且应用程序再次冻结相同的时间。每次都会发生这种情况。这是清单中的活动配置:

 <activity
        android:name=".activities.HomeActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustPan|adjustResize" />

我为android:windowSoftInputMode尝试了不同的组合,但无济于事。尽管在具有相同清单配置和较少字段数的其他活动中不会发生这种情况。输入字段如此多,对于用户在文本字段中输入数据后应用程序冻结的情况非常烦人。有人可以建议我解决此问题吗?

2 个答案:

答案 0 :(得分:0)

我将需要动手调试才能找到问题,但是我认为我要做的是:

  1. 检查是否实际上是因为有这么多的片段和输入控件所致。
    您可以仅使用1个片段而不是5个片段尝试一下,看看速度是否有所提高?
    如果是,则尝试一次显示一个片段(例如:如果您从选项卡1切换到选项卡2,则从分页器视图层次结构中显式删除分片1,并明确地将分片2添加到分页器视图层次中)。如果简化控件后仍看到冻结,则可能不是因为控件过多。

  2. 检查是否存在令人讨厌的控件。
    也许您有一个或两个控件意外地执行了使您的资源负担沉重的例程。如果从第一点开始,您会发现一个片段,该片段会显着降低应用程序的显示速度,那么您可能需要进一步检查该片段和内部控件。

答案 1 :(得分:0)

我找到了解决方案。在大多数布局中,视图使用RelativeLayout属性在android:layout_below内彼此垂直对齐,例如:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

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

            <!--nested form view containers-->

        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/layout1"
        android:orientation="vertical">

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

            <!--nested form view containers-->

        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/layout2"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!--nested form view containers-->

        </RelativeLayout>

    </LinearLayout>

</RelativeLayout>

我将根RelativeLayouts替换为垂直方向的LinearLayouts,它做了如下魔术:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

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

            <!--nested form view containers-->

        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

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

            <!--nested form view containers-->

        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!--nested form view containers-->

        </RelativeLayout>

    </LinearLayout>

</LinearLayout>

我仍在寻找有关它如何影响键盘可见性状态的技术细节。如果有发现,将在这里更新。