Android 软键盘之 windowSoftInputMode 分析

Android 软键盘弹出可能会遮挡住界面上的 EditText 或者是其他控件,有时还会出现莫名其妙的问题,解决软键盘问题,先从 windowSoftInputMode 入手。windowSoftInputMode 常用的有 adjustPan,adjustResize,adjustNothing 等。本文也只研究这几个属性,其他可自行百度。

为 Activity 指定 windowSoftInputMode

这个非常简单,可以在 AndroidManifest.xml 也可以在 java 代码中指定。

在 xml 中使用

   <activity
       android:name=".MainActivity"
       android:label="@string/app_name" 
       android:windowSoftInputMode="adjustPan">
       <intent-filter>
           <action android:name="android.intent.action.MAIN" />

           <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
   </activity>

在 java 中使用

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    }
}

接下来分析 windowSoftInputMode 常用的一些属性。

adjustPan

Activity 窗口(DecorView) 大小不变。当获取到焦点的 EditText 位于屏幕下方,软键盘弹出会遮挡到 EditText 时,整个 DecorView 会往上移动,至于上移多少并不确定。
一般是上移至使 EditText 刚好不被软键盘遮挡住为止。这个属性用的比较多,常常配合 ScrollView 来使用。

adjustPan软键盘弹出示意图

adjustPan软键盘弹出示意图

adjustResize

顾名思义,这种模式会自动调整大小。通过 hierarchy View 观察,decorView 大小本身并不会改变,但是我们的内容区 contentView (id = android.R.content) 会相应的缩小,为键盘的显示挪出空间。contentView 的下面为空白区域,软键盘就是覆盖在这个区域。

注意:adjustResize 只是调整 contentView 的大小,所以还是有可能覆盖掉 EditText。

adjustResize 最有用的是,这种模式可以轻松的获取到软键盘的高度,软键盘弹出后 contentView 高度变化的差值即为软键盘高度。

另外:这种模式可能会有个问题,当键盘消失时屏幕会出现一闪感觉有点难受。原因是键盘弹出时,键盘位置显示的是 windowBackground ,如果 windowBackground 为黑色而 Activity 背景为白色,当键盘消失时就会有闪动。解决办法是在 Activity 主题上添加一个 android:windowBackground 属性修改 windows 背景。

adjustResize软键盘弹出示意图
adjustResize软键盘弹出示意图

adjustNothing

这种模式 Activity窗口不会做任何调整,contentView 大小也不会改变。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值