CardView 键盘弹起时的滚动行为

CardView Scroll behavior when keyboard is up

我们应用的主要内容是CardView的RecylerView。对于注册,我们需要的不仅仅是 username/password 来创建一个帐户,因此我们决定让注册流程从 CardView 中流出,以匹配用户注册后的体验。

为此,我有一个 Activity 动画片段从底部进入,现有片段从顶部进入以模拟滚动。当用户输入数据并点击下一步前进时,就会发生这种假滚动。除了一种情况外,这工作得很好。当我们有一个用于输入的 EditText 时,键盘会出现并覆盖屏幕底部的 'next' 按钮。

在我们的用户测试中,我们注意到很大比例的用户试图向上滚动卡片以转到下一个按钮,而不是关闭键盘。

我花了很多时间尝试让 CardView 向上滚动以显示按钮,但没有成功,我没有想法,正在寻找新的想法。

注册 Activity 布局仅包含我将 Fragment 加载到其中的 FrameLayout。加载的每个片段都有一个用于根布局的 CardView。

在清单中,我已将 activity 的 windowsSoftInputMode 设置为 adjustResize、adjustPan,但收效甚微。

activity_signup.xml

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/signUpContent"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

简化fragment_enter_code.xml

<android.support.v7.widget.CardView
style="@style/CardViewStyle.SignUp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="25dp"
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="8dp">

        <EditText
             android:id="@+id/codeEditText"
             style="@style/HintedEditText"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="Code"
             android:inputType="text"/>

        <Button
            style="@style/NextButton"
            android:id="@+id/nextButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:enabled="false"
            android:text="@string/next"/>

</android.support.v7.widget.CardView>

当我尝试将 CardView 放入 CardView 布局的 ScrollView 中(fillViewport 为 true)时,我得到了一个滚动条,但卡片没有滚动并且 CardView 布局变得混乱。

有谁知道 windowSoftInputMode 足以为我指明正确的方向?还是 CardView 只是不会滚动到设计用于容纳它们的容器之外?

感觉解决这个问题的方法是操纵 activity 的视图而不是片段。

我最终创建了一个新应用来解决这个问题,并注意到如果我的布局不包含 CardView,其根布局是 ScrollView,除非活动 windowSoftInputMode 是设置为 adjustResize 然后它会滚动。

然后我用 <ScrollView><CardView><content...></CardView></ScrollView> 制作了一个布局,CardView 的大小始终是卡片的默认行大小,而不是 match_parent。我在 ScrollView 上使用 fillViewPort="true" 解决了这个问题,但是当键盘出现时它不会滚动。

原来秘诀是在 CardView 和 ScrollView 之间放置一个 FrameLayout(或任何其他布局)。

您仍然需要考虑调整布局的大小,以防止您的视图元素不会相互堆叠,但是一旦您这样做了,您现在就可以在软键盘上方滚动视图并能够到达其余部分UI 和 CardView。

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:fillViewport="true">

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

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:cardCornerRadius="35dp"
            app:cardElevation="2dp"
            app:cardUseCompatPadding="true"
            app:contentPadding="8dp">

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

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:src="@drawable/common_ic_googleplayservices"/>

                <EditText
                    android:id="@+id/input"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="50dp"
                    android:layout_marginLeft="20dp"
                    android:layout_marginRight="20dp"
                    android:layout_below="@id/image"
                    android:hint="Input"
                    android:inputType="text"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_below="@id/input"
                    android:orientation="vertical"
                    android:gravity="bottom|center_horizontal">

                    <Button
                        android:id="@+id/nextButton"
                        android:layout_width="match_parent"
                        android:layout_height="48dp"
                        android:layout_marginLeft="20dp"
                        android:layout_marginRight="20dp"
                        android:enabled="false"
                        android:text="Next"/>

                </LinearLayout>

            </RelativeLayout>

        </android.support.v7.widget.CardView>

    </FrameLayout>

</ScrollView>