actionNext将不会滚动以显示最后的TextInputLayout

问题描述 投票:0回答:1

我有一个ConstraintLayout,其中包含8个TextInputLayout字段,每个字段都处于垂直方向(如垂直LinearLayout)。每个人的TextInputEditText中都有此行:

android:imeOptions="actionNext"

约束布局包含在NestedScrollView中。

这应该是捕获注册数据的简单形式。当用户完成每个字段时,他们点击Next按钮,表格垂直滚动到下一个字段。

这一切正常,直到用户完成倒数第二个字段为止。在这一点上,当用户单击下一步时,表单既不会滚动,也不会将焦点放在最终字段上。该字段被隐藏在软键盘后面,因此用户不知道它在那里。我可以手动滚动表单以显示它,但这不是我想要实现的行为。

这里是xml的相关部分:

活动:

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <fragment
        android:id="@+id/onboarding_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:defaultNavHost="false"
        app:navGraph="@navigation/onboarding_nav_graph" />

</androidx.core.widget.NestedScrollView>

然后在片段中,这是最后两个TextInputLayouts。其他的结构类似,因此为简洁起见,至少在目前,我省略了它们:

<com.google.android.material.textfield.TextInputLayout
            android:id="@+id/password_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:errorTextAppearance="@style/error_appearance"
            app:layout_constraintTop_toBottomOf="@id/cell_layout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintWidth_percent="0.8"
            app:passwordToggleEnabled="true"
            app:passwordToggleTint="@color/colorAccent"
            style="@style/MyTextInputLayout">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/reg_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/enter_password"
                android:maxLines="1"
                android:inputType="textPassword"
                android:imeOptions="actionNext"
                android:text="@{registrationData.password}"
                bind:regularTypeface='@{"raleway"}'
                style="@style/MyTextInputEditText"/>

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/password_confirm_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:errorTextAppearance="@style/error_appearance"
            app:layout_constraintTop_toBottomOf="@id/password_layout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintWidth_percent="0.8"
            app:passwordToggleEnabled="true"
            app:passwordToggleTint="@color/colorAccent"
            style="@style/MyTextInputLayout">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/reg_password_confirm"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/password_confirmation"
                android:maxLines="1"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                bind:regularTypeface='@{"raleway"}'
                style="@style/MyTextInputEditText"/>

        </com.google.android.material.textfield.TextInputLayout>

最后,在AndroidManifest中,活动声明如下:

<activity
    android:name=".activities.OnboardingActivity"
    android:theme="@style/AppTheme.NoActionBar"
    android:windowSoftInputMode="adjustResize"/>

无法找出我所缺少的。如何获得滚动视图以显示最后一个字段,而无需用户手动滚动该字段?

android android-activity android-scrollview android-textinputlayout
1个回答
1
投票

我知道了问题所在。请注意,最后两个TextInputLayout字段用于输入密码,并且app:passwordToggleEnabled都设置为true

在这种状态下,当在第一个Next字段(TextInputEditText)上点击reg_password按钮时,我希望下一个要聚焦的对象是reg_password_confirm。但是,当我在仿真器设置中打开Show Layout Bounds并仔细检查时,我发现有焦点的对象是reg_password右侧的切换(形状像眼睛的图标)。

修复非常简单。我使用的是android:imeOptions="actionNext,而不是reg_password块中的android:nextFocusForward="@id/reg_password_confirm"。这将覆盖算法,并将焦点显式切换到reg_password_confirm

这也会导致滚动视图向下移动以显示TextInputLayout字段。

我希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.