【问题标题】:Strange behaviour using keyboard on ConstraintLayout在 ConstraintLayout 上使用键盘的奇怪行为
【发布时间】: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>

我已经阅读了这两个线程并尝试了建议的解决方案,但没有解决我的问题:

当键盘出现时,我希望实现的行为与我使用 LinearLayout 但使用 ConstraintLayout 时的行为相同,否则,如果不可能,这是一个可行的替代方案。

提前致谢!

【问题讨论】:

    标签: android android-constraintlayout android-softkeyboard android-scrollview android-nestedscrollview


    【解决方案1】:

    您可以考虑使用 ScrollView 或 NestedScrollView 作为您的根布局。这意味着您当前的 ConstraintLayout 将在 ScrollView 内。我相信这应该可以帮助你达到你想要的结果。

    【讨论】:

    • 已经试过了……还是不滚动。还尝试了变体 ConstraintLayout - (Nested)ScrollView - ConstraintLayout... 结果相同
    【解决方案2】:

    Activity 的主窗口总是会调整大小,以便为软体腾出空间 屏幕上的键盘。

    “调整大小”

    • 您只需要在所需的内容中添加这一行活动的标签AndroidManifest.xml文件。

      android:windowSoftInputMode="adjustResize"
      

    像这样:

     <activity
                android:name=".MainActivity"
                android:windowSoftInputMode="adjustResize"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity> 
    

    • 调整布局大小后

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2011-12-05
      • 2011-03-30
      • 2021-02-07
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      相关资源
      最近更新 更多