ViewPager2中子ImageView随软键盘弹出自动Resize问题求助
问题分析
当使用TabLayout+ViewPager2加载包含ImageView的Fragment时,软键盘弹出后ImageView会缩小,核心原因是:
- ViewPager2通过
layout_height="0dp"+layout_weight="1"依赖父LinearLayout分配剩余高度,软键盘弹出时Activity窗口高度被压缩,LinearLayout会重新分配高度,导致ViewPager2高度变小; - ImageView设置了
adjustViewBounds="true",会按比例缩小以适应父布局的高度变化; - 直接在FrameLayout中显示Fragment时,默认的
windowSoftInputMode为adjustPan(布局整体上移,不压缩高度),因此ImageView尺寸不受影响。
以下是针对性的解决方案:
方案1:在目标Fragment中动态控制软键盘模式(仅影响当前Fragment)
在包含ImageView的Fragment中,仅在其可见时将Activity的软键盘模式设为adjustPan(避免压缩布局),离开时恢复原模式,不影响其他Fragment:
class ImageFragment : Fragment() { private var originalInputMode: Int? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 记录Activity原始的软键盘模式 originalInputMode = requireActivity().window.attributes.softInputMode } override fun onResume() { super.onResume() // 切换为adjustPan,软键盘弹出时仅上移布局,不压缩高度 requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) } override fun onPause() { super.onPause() // 恢复原始模式,保证其他Fragment不受影响 originalInputMode?.let { requireActivity().window.setSoftInputMode(it) } } }
方案2:修改ImageView布局约束,脱离父布局高度依赖
将原RelativeLayout替换为ConstraintLayout,通过宽高比约束固定ImageView的尺寸逻辑,避免受父布局高度变化影响:
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/input_image" android:layout_width="wrap_content" android:layout_height="0dp" android:contentDescription="@string/input_image_desc" android:src="@drawable/input_image" android:adjustViewBounds="true" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_centerInParent="true" app:layout_constraintDimensionRatio="H,16:9"/> <!-- 替换为你的图片实际宽高比 --> <EditText android:id="@+id/input_text" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_centerInParent="true"/> </androidx.constraintlayout.widget.ConstraintLayout>
方案3:固定ViewPager2高度,不受软键盘压缩
监听ViewPager2的布局变化,记录其原始高度,当软键盘弹出导致高度缩小时,强制恢复原始高度:
class TabHostFragment : Fragment() { private var originalViewPagerHeight = 0 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val viewPager = view.findViewById<ViewPager2>(R.id.pager) viewPager.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { // 首次加载时记录ViewPager2的原始高度 if (originalViewPagerHeight == 0) { originalViewPagerHeight = viewPager.height } else { // 软键盘弹出时高度会缩小,强制恢复原始高度 if (viewPager.height < originalViewPagerHeight) { val params = viewPager.layoutParams params.height = originalViewPagerHeight viewPager.layoutParams = params } } } }) } }
内容的提问来源于stack exchange,提问作者Jony Thrive
相关产品推荐
相关产品推荐

