当我将应用程序的目标 SDK 从 34 增加到 35 时,
windowSoftInputMode
模式下的 adjustResize
不再起作用。我已经测试了一切,发现它只与目标SDK有关。例如,我在不同版本的 Android 的不同设备上测试了它,但它不起作用,我在不同布局的多个 Activity 中测试了它,我在不同的 windowSoftInputMode
模式下测试了它,我还测试了 fitsSystemWindows
。它在任何情况下都不起作用,我很确定它与目标 SDK 35 有关。但经过几个小时的尝试,我没有找到任何解决方案。
问题是这样的:我在清单中有一个值为
android:windowSoftInputMode="adjustResize"
的活动,在目标 SDK 35 中,当打开键盘时,布局不会放置在键盘顶部,并且键盘会覆盖屏幕,但是在目标SDK 34及以下版本中,不存在此问题。
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:focusable="true"
android:fitsSystemWindows="true"
android:focusableInTouchMode="true"
tools:context=".view.RegisterNameActivity">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/back"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_10"
android:background="?selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_6"
android:tint="?colorOnSurface"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_back_24" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/iran_sans_demi_bold"
android:text="@string/your_name"
android:textColor="?colorOnSurface"
android:textSize="@dimen/text_26"
app:layout_constraintBottom_toTopOf="@+id/description"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4"
app:layout_constraintVertical_chainStyle="packed" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_32"
android:layout_marginTop="@dimen/margin_4"
android:layout_marginEnd="@dimen/margin_32"
android:gravity="center"
android:paddingStart="@dimen/padding_8"
android:paddingEnd="@dimen/padding_8"
android:text="@string/your_name_and_bio_description"
android:textColor="?colorOnSurfaceVariant"
android:textSize="@dimen/text_14"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toTopOf="@+id/name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_32"
android:layout_marginTop="@dimen/margin_32"
android:layout_marginEnd="@dimen/margin_32"
android:backgroundTint="?colorOnSurface"
android:gravity="start|center_vertical"
android:hint="@string/name_required"
android:imeOptions="flagNoExtractUi"
android:paddingStart="@dimen/padding_8"
android:paddingEnd="36dp"
android:singleLine="true"
android:textDirection="locale"
app:layout_constraintBottom_toTopOf="@+id/bio"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/description"
tools:ignore="RtlHardcoded" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/nameLength"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="-4dp"
android:layout_marginEnd="@dimen/margin_4"
android:textColor="?colorOnSurfaceVariant"
android:textSize="@dimen/text_10"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="@+id/name"
app:layout_constraintTop_toBottomOf="@+id/name"
tools:text="0/25" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/nameError"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_8"
android:layout_marginTop="-4dp"
android:layout_marginEnd="@dimen/margin_8"
android:textColor="?colorError"
android:textSize="@dimen/text_10"
android:visibility="gone"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@+id/nameLength"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="@+id/name"
app:layout_constraintTop_toBottomOf="@+id/name"
tools:text="Please enter your name"
tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/clearName"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="-3dp"
android:padding="10dp"
android:tint="?colorOnSurfaceVariant"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/name"
app:layout_constraintEnd_toEndOf="@+id/name"
app:layout_constraintTop_toTopOf="@+id/name"
app:srcCompat="@drawable/ic_close_16"
tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/bio"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_16"
android:backgroundTint="?colorOnSurface"
android:gravity="start|center_vertical"
android:hint="@string/biography_optional"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine"
android:textDirection="locale"
android:paddingStart="@dimen/padding_8"
android:paddingEnd="36dp"
app:layout_constraintBottom_toTopOf="@+id/termsAndConditions"
app:layout_constraintEnd_toEndOf="@+id/name"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/name"
app:layout_constraintTop_toBottomOf="@+id/name"
tools:ignore="RtlHardcoded" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/clearBio"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="-3dp"
android:padding="10dp"
android:tint="?colorOnSurfaceVariant"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/bio"
app:layout_constraintEnd_toEndOf="@+id/bio"
app:layout_constraintTop_toTopOf="@+id/bio"
app:srcCompat="@drawable/ic_close_16"
tools:visibility="visible" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/bioLength"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="-4dp"
android:layout_marginEnd="@dimen/margin_4"
android:textColor="?colorOnSurfaceVariant"
android:textSize="@dimen/text_10"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="@+id/bio"
app:layout_constraintTop_toBottomOf="@+id/bio"
tools:text="0/256" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/termsAndConditions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_32"
android:layout_marginEnd="@dimen/margin_32"
android:layoutDirection="ltr"
android:textColor="?colorOnSurfaceVariant"
android:textSize="@dimen/text_12"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@+id/submitFab"
app:layout_constraintEnd_toStartOf="@+id/submitFab"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/submitFab"
tools:text="By registering, you agree to the terms and conditions of using the App." />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/submitFab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_24"
android:clickable="true"
android:focusable="true"
android:layoutDirection="ltr"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:rippleColor="?colorOnPrimaryContainer"
app:srcCompat="@drawable/ic_done_24"
tools:ignore="ContentDescription,NotSibling" />
</androidx.constraintlayout.widget.ConstraintLayout>
自 Android 15 (Android API 35) 起,应用程序现在默认为边缘到边缘。通过此更改,
adjustResize
本身还不够。
正如本文所描述的:
在面向 SDK 35 之前,您只需使用
即可在打开 IME 时保持对 RecyclerView 中的 EditText 的关注。通过“adjustResize”,框架将 IME 视为系统窗口,并填充窗口的根视图,以便内容避开系统窗口。
android:windowSoftInputMode=”adjustResize”
针对 SDK 35 后,您还必须使用
和ViewCompat.setOnApplyWindowInsetsListener
考虑 IME,因为框架不会填充窗口的根视图。
WindowInsetsCompat.Type.ime()
因此,为了在显示键盘时保持对 EditText 的关注,您必须在插入填充中添加
ime()
类型。然后,当您在视图上设置插图时,您还必须按如下方式获取此类型:
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
val bars = insets.getInsets(
WindowInsetsCompat.Type.systemBars()
or WindowInsetsCompat.Type.displayCutout()
or WindowInsetsCompat.Type.ime() // adding the ime's height
)
view.updatePadding(
left = bars.left,
top = bars.top,
right = bars.right,
bottom = bars.bottom
)
WindowInsetsCompat.CONSUMED
}