【发布时间】:2022-11-07 21:24:22
【问题描述】:
我在 Android 上开发我的应用程序时遇到问题。长期以来,该应用程序旨在仅在固定分辨率的平板电脑上运行,因此我们使用 LinearLayouts 设计布局。现在我们需要在各种 Android 设备(包括智能手机)上部署应用程序,因此按照 Android 开发人员指南,我决定将所有布局转换为更新的 ConstraintLayout;对于我的启动画面活动,一切都在各种设备上运行良好。
登录活动出现问题:带有徽标、用户名和密码字段和按钮的简单布局;使用旧的 LinearLayout,当我单击其中一个字段时,软输入键盘会出现,让我滚动以在字段和按钮之间移动,这是理想的行为。使用 ConstraintLayout 代替,当键盘显示时布局不再滚动并输入密码,直到我将焦点从该字段移开,我才能看到进度。
这是我的实际布局:
<?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>
我已经阅读了这两个线程并尝试了建议的解决方案,但没有解决我的问题:
- Scrollable screen on soft keyboard open, using Constraint layout
- Window Soft Input Mode ConstraintLayout
当键盘出现时,我希望实现的行为与我使用 LinearLayout 但使用 ConstraintLayout 时的行为相同,否则,如果不可能,这是一个可行的替代方案。
提前致谢!
【问题讨论】:
标签: android android-constraintlayout android-softkeyboard android-scrollview android-nestedscrollview