Android登录页ConstraintLayout软键盘弹出后无法滚动问题求助
Android登录页ConstraintLayout软键盘滚动适配问题
问题详情
之前的应用仅针对固定分辨率平板开发,采用LinearLayout布局。现在要适配多类Android设备(包括手机),按照官方指南改成ConstraintLayout后,闪屏页适配正常,但登录页出现两个问题:
- 原LinearLayout布局下,点击输入框弹出软键盘后,布局可滚动切换控件;
- 改成ConstraintLayout后,软键盘弹出时布局无法滚动,输入密码时看不到实时输入进度,必须失去焦点才显示。
试过StackOverflow上的相关方案未解决,需实现与LinearLayout相同的软键盘滚动效果或可行替代方案。
当前布局代码:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/top_constraint_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/imageView" android:layout_width="0dp" android:layout_height="0dp" android:contentDescription="@string/empty_row" android:scaleType="fitXY" android:src="@drawable/logo" app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal15" app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal45" app:layout_constraintStart_toEndOf="@+id/guidelineVertical20" app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" /> <EditText android:id="@+id/username" style="@style/LayoutLoginEditTextStyle" android:layout_width="0dp" android:layout_height="0dp" android:autofillHints="" android:background="@android:color/transparent" android:gravity="center" android:hint="@string/prompt_email" android:inputType="text" android:nextFocusForward="@+id/password" android:textColorHint="#78909C" android:textSize="@dimen/_12ssp" app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal525" app:layout_constraintBottom_toBottomOf="@id/guidelineHorizontal60" app:layout_constraintStart_toEndOf="@id/guidelineVertical20" app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" /> <View android:id="@+id/view" android:layout_width="0dp" android:layout_height="2dp" android:background="#B4B4B4" app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal60" app:layout_constraintStart_toEndOf="@id/guidelineVertical20" app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" /> <EditText android:id="@+id/password" style="@style/LayoutLoginEditTextStyle" android:layout_width="0dp" android:layout_height="0dp" android:autofillHints="" android:background="@android:color/transparent" android:gravity="center" android:hint="@string/prompt_password" android:imeActionLabel="@string/action_sign_in_short" android:imeOptions="actionGo" android:inputType="textPassword" android:textColorHint="#A1887F" android:textSize="@dimen/_12ssp" app:layout_constraintBottom_toTopOf="@id/guidelineHorizontal675" app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" app:layout_constraintStart_toEndOf="@id/guidelineVertical20" app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal60" /> <it.company.etmlib.ui.graphics.EasyButton style="@style/EasyButton" android:id="@+id/registration_button" android:layout_width="0dp" android:layout_height="0dp" android:layout_gravity="center" android:padding="0dp" android:text="@string/action_sign_in_register" android:textColor="@color/black_text" android:textSize="@dimen/_11ssp" app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal75" app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal85" app:layout_constraintStart_toEndOf="@+id/guidelineVertical30" app:layout_constraintEnd_toStartOf="@+id/guidelineVertical45" /> <it.company.etmlib.ui.graphics.EasyButton style="@style/EasyButton" android:id="@+id/sign_in_button" android:layout_width="0dp" android:layout_height="0dp" android:layout_gravity="center" android:padding="0dp" android:text="@string/action_sign_in_short" android:textColor="@color/black_text" android:textSize="@dimen/_11ssp" app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal75" app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal85" app:layout_constraintStart_toEndOf="@+id/guidelineVertical55" app:layout_constraintEnd_toStartOf="@+id/guidelineVertical70" /> <ImageView android:id="@+id/info_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="20dp" android:background="@drawable/logo_info" android:contentDescription="@string/empty_row" android:visibility="visible" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <ProgressBar style="@android:style/Widget.DeviceDefault.ProgressBar.Large" android:id="@+id/login_progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <TextView android:id="@+id/login_status_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-light" android:text="@string/login_progress_signing_in" android:textSize="@dimen/_10ssp" android:textAppearance="?android:attr/textAppearanceMedium" android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/login_progress_bar" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal15" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.15" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal45" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.45" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal525" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.525" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal60" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.6" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal675" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.675" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal75" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.75" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineHorizontal85" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.85" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical20" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.2" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical25" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.25" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical30" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.30" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical45" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.45" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical50" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.5" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical55" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.55" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical70" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.70" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical75" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guidelineVertical80" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.8" /> <View android:id="@+id/bottomView" android:layout_width="0dp" android:layout_height="1dp" android:background="#FFFFFF" app:layout_constraintTop_toBottomOf="@+id/top_constraint_layout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
解决办法
1. 给ConstraintLayout套ScrollView
这是最快解决滚动问题的方式,让整个登录页具备滚动能力:
- 将原根布局的ConstraintLayout整体包裹在ScrollView内;
- 给ScrollView添加
android:fillViewport="true",保证布局能铺满屏幕; - 把ConstraintLayout的
android:layout_height改为wrap_content,否则ScrollView无法触发滚动。
修改后的布局结构示例:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/top_constraint_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 原布局内所有控件保持不变 --> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView>
2. 配置Activity软键盘模式
在AndroidManifest.xml中,给登录页对应的Activity添加软键盘调整属性,让系统自动适配布局空间:
<activity android:name=".LoginActivity" android:windowSoftInputMode="adjustResize"> </activity>
adjustResize会让Activity窗口缩小,为软键盘腾出空间,配合ScrollView使用效果最佳。
3. 修复密码输入框实时显示问题
针对密码输入无法实时看到进度的问题,排查以下几点:
- 检查
LayoutLoginEditTextStyle中是否有遮挡输入的padding、margin或背景设置; - 将输入框的
android:gravity="center"改为android:gravity="center_vertical",避免垂直居中导致输入内容被隐藏; - 确认
android:inputType="textPassword"没有与其他输入类型属性冲突。
4. 备选方案:用NestedScrollView替代ScrollView
如果后续需要配合CoordinatorLayout实现复杂滚动效果,直接替换为NestedScrollView即可,用法与ScrollView完全一致,支持嵌套滚动。
内容的提问来源于stack exchange,提问作者Lubron
相关产品推荐
相关产品推荐

