Android中的windowSoftInputMode杂谈

相信做过Android开发的同学,都曾经遇到过系统输入法不按照你的想法弹出的情况。那今天我们就来聊聊windowSoftInputMode这个东西吧!


首先,系统定义的windowSoftInputMode共有9种分别是:stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。


1:stateUnspecified 就是默认状态,这个属性处于此状态的时候。系统会根据自己的需要来判断是否需要显示输入法。1:如果界面没有需要输入的文本框时,不会弹出。2:有需要输入的文本框,在文本框获取焦点,同时外面包裹Scroll的时候,会自动弹出。这个属性是一个比较难判断准确得属性。

2:stateUnchange 这个属性,软键盘弹出的取决因素是上一个界面的键盘状态。

3:stateHidden 如果Activity是通过启动来显示的,那么使用此状态,键盘不管之前的状态,都会隐藏。但如果是从ActivityTask由于上一个Activity死亡,导致显示的话,会使用默认属性。

4:stateAlwaysHidden 跟StateHidden的区别是无论是通过什么方式显示的Activity都会隐藏软键盘。

5:stateVisible  此属性与stateHidden流程相同,效果相反。

6:stateAlwaysVisible 无论如何都会弹出软键盘

7:adjustUnspecified 如果界面没有ScrollView,那么覆盖软键盘部分的内容,但保证需要输入的部分被顶到上面保证可以看到输入的内容。如果有ScrollView ScrollView会调整大小,从而可以随意滚动,展示所有内容

8:adjustResize 如果没有ScrollView 在覆盖部分的内容, 并不会被顶上去,依然是不可见的。如果有ScrollView ScrollView会调整大小,从而可以随意滚动,展示所有内容

9:adjustPan 如果没有ScrollView 与默认效果相同,如果有ScrollView ScrollView不会调整大小,不可以滚动。

windowSoftInputMode属性就说到这里。下面我们来看一些常见问题。


情况一:当显示的页面有输入框,同时又ScrollView的时候。

在这种情况下,当进入这个页面的时候,软键盘会自动弹出。如果不想自动键盘弹出,这个时候你可以设置属性如下:

 android:windowSoftInputMode="stateAlwaysHidden|adjustResize"

情况二:当显示页面有输入框,同时下方有Button,外层还包裹了ScrollView时,比如注册登录页面。如果有点击EditText时,让SCrollView滑动到Button可以点击。

要解决这种需求,需要为EditText添加TouchListener。在点击时,让本页面的ScrollView滑动到底部,关键代码如下:

public void scrollToBottom() {
  Handler mHandler = new Handler();
  mHandler.postDelayed(new Runnable() {
   @Override
   public void run() {
    register_scroll.fullScroll(ScrollView.FOCUS_DOWN);
    verificationCodeEdit.setFocusable(true);
    verificationCodeEdit.setFocusableInTouchMode(true);
    verificationCodeEdit.requestFocus();
    verificationCodeEdit.findFocus();
   }
  },200);
注意,为何此处要添加EditText获取焦点的代码呢,因为ScrollView滑动,有时候会影响到本页面内获取焦点的EditText。

同时,handler的延时跟各种手机也有一定的关系,具体值,请自行测试


情况三:隐藏系统弹出的键,

方法1:设置EditText的InputT代码如下:

 private class My_Edit_TouchListener implements View.OnTouchListener{

        private EditText mEdit;

        public My_Edit_TouchListener(EditText edit){
            mEdit = edit;
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int inputType= mEdit.getInputType();
            mEdit.setInputType(InputType.TYPE_NULL);
            mEdit.setFocusable(true);
            mEdit.setFocusableInTouchMode(true);
            mEdit.requestFocus();
            mEdit.findFocus();
            mEdit.setCursorVisible(true);
            mEdit.onTouchEvent(event);
            mEdit.setInputType(inputType);
            return true;
        }
    }

将EditText的InputType设置为InputType.TYPE_NULL在EditText设置为这个属性时,软键盘无论如何都不会出来了.

方法2:利用InputMethodManager

InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

关于软盘的显示,隐藏规则,就先记这么多吧!




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值