美文网首页
关于Android软键盘在全屏下设置adjustResize无效

关于Android软键盘在全屏下设置adjustResize无效

作者: 戎码虫 | 来源:发表于2021-11-25 00:32 被阅读0次

    描述

    最近写项目的时候,框架为了保证沉浸式的效果,整体从底层实现了就将整个Activity设置为全屏,从而使adjustResize设置失效,导致输入框不上移。
    设置adjustResize正常情况下:


    正常情况下

    问题一

    全屏情况下:

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window?.apply {
          setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
          val option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
          decorView.systemUiVisibility = option
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            statusBarColor = Color.BLACK
          }
        }
        setContentView(R.layout.activity_main)
      }
    
    <?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"
        tools:context=".MainActivity"
        >
      <EditText
          android:id="@+id/etName"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:hint="用户名"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          />
    
      <EditText
          android:id="@+id/etPassword"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginTop="20dp"
          android:hint="密码"
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/etName"
          />
    
      <Button
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginTop="30dp"
          android:text="登录"
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/etPassword"
          />
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    就出现如下情况,adjustResize失效了。


    bug1

    解决

    在根布局中添加 android:fitsSystemWindows="true"属性,使系统窗口来调整自己的布局。

    <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"
        tools:context=".MainActivity"
        android:fitsSystemWindows="true"
        >
       ···
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    问题二

    当布局中存在ScrollView或者NestedScrollView又回出现类似的情况

    <?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:fitsSystemWindows="true"
        tools:context=".MainActivity"
        >
      <ScrollView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          >
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
    
          <TextView
              android:id="@+id/tvContent"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:lineSpacingMultiplier="2"
              android:text="歌词是诗歌的一种,入乐的叫歌,不入乐的叫诗(或词)。入乐的歌在感情抒发、形象塑造上和诗没有任何区别,但在结构上、节奏上要受音乐的制约,在韵律上要照顾演唱的方便,在遣词炼字上要考虑听觉艺术的特点,因为它要入乐歌唱。歌词与诗的分别,主要是诗不一定要入乐(合乐),歌词是要合乐的。合乐成为歌曲。歌词一般是配合曲子旋律一同出现的,歌词是歌曲的本意所在。现代一般是配合音乐,便于哼唱的语句。"
              app:layout_constraintTop_toTopOf="parent"
              />
    
          <EditText
              android:id="@+id/etName"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="50dp"
              android:hint="用户名"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/tvContent"
              />
    
          <EditText
              android:id="@+id/etPassword"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="20dp"
              android:hint="密码"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/etName"
              />
    
          <Button
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="30dp"
              android:text="登录"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/etPassword"
              />
        </androidx.constraintlayout.widget.ConstraintLayout>
      </ScrollView>
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    bug2

    解决

    此时注意三个地方添加属性, 跟布局的 android:fitsSystemWindows="true",NestedScrollView的android:fillViewport="true"和ScrollView的直接子布局ConstraintLayout的 android:layout_gravity="bottom",三个地方的属性缺一个都会存在问题。

    <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:fitsSystemWindows="true"
        tools:context=".MainActivity"
        >
      <androidx.core.widget.NestedScrollView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:fillViewport="true"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          >
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            >
             ···
          </LinearLayout>
    
        </androidx.core.widget.NestedScrollView>
    
      </LinearLayout>
    

    总结

    这个可能是谷歌的一个bug吧,有懂的大佬解释一下。

    相关文章

      网友评论

          本文标题:关于Android软键盘在全屏下设置adjustResize无效

          本文链接:https://www.haomeiwen.com/subject/dsbotrtx.html