actionNext 不会滚动显示最后一个 TextInputLayout
actionNext Won't Scroll to Reveal the Last TextInputLayout
我有一个 ConstraintLayout
,其中包含 8 个 TextInputLayout
字段,每个字段都在垂直方向(如垂直 LinearLayout
)。每个 TextInputEditText
:
中都有这一行
android:imeOptions="actionNext"
约束布局包含在 NestedScrollView
。
这应该用作捕获注册数据的简单表单。当用户完成每个字段时,他们点击 Next
按钮,表单垂直滚动到下一个字段。
这一切工作正常,直到用户完成倒数第二个字段。此时,当用户点击下一步时,表单既不滚动也不将焦点放在最后一个字段。该字段隐藏在软键盘后面,因此用户不知道它在那里。我可以手动滚动表单以显示它,但这不是我想要实现的行为。
这里是xml的相关部分:
Activity:
<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 声明如下:
<activity
android:name=".activities.OnboardingActivity"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
无法弄清楚我错过了什么。如何让滚动视图显示最后一个字段而无需用户手动滚动该字段?
我明白问题出在哪里了。请注意,最后两个 TextInputLayout
字段用于密码,并且 app:passwordToggleEnabled
都设置为 true
。
鉴于此状态,当 Next
按钮在第一个 TextInputEditText
字段 (reg_password
) 上被点击时,我预计下一个获得焦点的对象应该是 reg_password_confirm
。但是当我在模拟器设置中打开 Show Layout Bounds
并仔细检查它时,我注意到具有焦点的对象是 reg_password
右侧的切换开关(形状像眼睛的图标) .
修复非常简单。我在 reg_password
块中没有使用 android:imeOptions="actionNext
,而是使用了 android:nextFocusForward="@id/reg_password_confirm"
。这会覆盖算法并将焦点显式切换到 reg_password_confirm
。
这也会导致滚动视图向下移动以显示 TextInputLayout
字段。
我希望这对某人有所帮助。
我有一个 ConstraintLayout
,其中包含 8 个 TextInputLayout
字段,每个字段都在垂直方向(如垂直 LinearLayout
)。每个 TextInputEditText
:
android:imeOptions="actionNext"
约束布局包含在 NestedScrollView
。
这应该用作捕获注册数据的简单表单。当用户完成每个字段时,他们点击 Next
按钮,表单垂直滚动到下一个字段。
这一切工作正常,直到用户完成倒数第二个字段。此时,当用户点击下一步时,表单既不滚动也不将焦点放在最后一个字段。该字段隐藏在软键盘后面,因此用户不知道它在那里。我可以手动滚动表单以显示它,但这不是我想要实现的行为。
这里是xml的相关部分:
Activity:
<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 声明如下:
<activity
android:name=".activities.OnboardingActivity"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
无法弄清楚我错过了什么。如何让滚动视图显示最后一个字段而无需用户手动滚动该字段?
我明白问题出在哪里了。请注意,最后两个 TextInputLayout
字段用于密码,并且 app:passwordToggleEnabled
都设置为 true
。
鉴于此状态,当 Next
按钮在第一个 TextInputEditText
字段 (reg_password
) 上被点击时,我预计下一个获得焦点的对象应该是 reg_password_confirm
。但是当我在模拟器设置中打开 Show Layout Bounds
并仔细检查它时,我注意到具有焦点的对象是 reg_password
右侧的切换开关(形状像眼睛的图标) .
修复非常简单。我在 reg_password
块中没有使用 android:imeOptions="actionNext
,而是使用了 android:nextFocusForward="@id/reg_password_confirm"
。这会覆盖算法并将焦点显式切换到 reg_password_confirm
。
这也会导致滚动视图向下移动以显示 TextInputLayout
字段。
我希望这对某人有所帮助。