Android Activity 中阻止自动弹出系统软键盘

Android Activity 中阻止自动弹出系统软键盘

有时需要在Activity中阻止自动弹出系统软键盘,比如已经自定义了输入盘,不希望系统再自动弹出软键盘,这样会同时存在两个输入键盘,可能影响用户体验。

阻止自动弹出软键盘的方式一

  1. 需设定Activity的android:windowSoftInputMode属性为 stateHidden
<activity android:name=".XXActivity" android:label="@string/app_name"
android:windowSoftInputMode="stateHidden" />
如上,需设定Activity的android:windowSoftInputMode属性为 stateHidden

扩展一下 android:windowSoftInputMode属性一共同拥有9个取值。各自是:
stateUnspecified,stateUnchanged。stateHidden,stateAlwaysHidden。stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize。adjustPan


以下内容摘自http://blog.csdn.net/zhaokaiqiang1992,未经验证。
1.stateUnspecified
中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认採用的就是这样的交互方式,系统会依据界面採取对应的软键盘的显示模式。比方。当界面上仅仅有文本和button的时候,软键盘就不会自己主动弹出。由于没有输入的必要。
2.stateUnchanged
中文的意思就是状态不改变的意思。我们应该怎么理解这句话呢?事实上非常好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个样例,假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;假设当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。
3.stateHidden
顾名思义,假设我们设置了这个属性,那么键盘状态一定是隐藏的,无论上个界面什么状态。也无论当前界面有没有输入的需求,反正就是不显示。因此,我们能够设置这个属性,来控制软键盘不自己主动的弹出。
4.stateAlwaysHidden
这个属性也能够让软键盘隐藏。
5.stateVisible
设置为这个属性,能够将软键盘召唤出来,即使在界面上没有输入框的情况下也能够强制召唤出来。
6.stateAlwaysVisible
这个属性也是能够将键盘召唤出来,可是与stateVisible属性有小小的不同之处。举个样例,当我们设置为stateVisible属性,假设当前的界面键盘是显示的,当我们点击button跳转到下个界面的时候,软键盘会由于输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。可是假设我们设置为stateAlwaysVisible,我们跳转到下个界面,软键盘还是隐藏的,可是当我们再次回来的时候。软键盘是会显示出来的。
7.adjustUnspecified
设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会依据界面选择不同的模式。假设界面里面有能够滚动的控件,比方ScrowView。系统会减小能够滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到全部的内容。假设布局里面没有滚动的控件。那么软键盘可能就会盖住一些内容
8.adjustResize
这个属性表示Activity的主窗体总是会被调整大小,从而保证软键盘显示空间。
9.adjustPan
假设设置为这个属性。那么Activity的屏幕大小并不会调整来保证软键盘的空间。而是採取了第二种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的失业范围里面,从而让用户能够看到自己输入的内容。对于没有滚动控件的布局来说。这个事实上就是默认的设置,假设我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。可是对于有滚动控件的布局来说。则不太一样。我们看以下的效果图。
总结:假设我们不设置”adjust…”的属性,对于没有滚动控件的布局来说,採用的是adjustPan方式,而对于有滚动控件的布局,则是採用的adjustResize方式。

阻止自动弹出软键盘的方式二

  1. 通过代码动态隐藏软键盘
//隐藏键盘
    private void HideKeyboard() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                InputMethodManager manager = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
                manager.hideSoftInputFromWindow(
                        InputCameraActivity.this.getCurrentFocus().getWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS
                );
            }
        }, 10);
    }
 // 代码放在onResume中执行

以上代码应该放在onResume中,自测在onResume中执行完隐藏键盘的逻辑,软键盘仍然弹出;造成这个问题,是因为在onResume执行时,系统键盘是不可见的,此时执行隐藏,是没有用的。所以需要延时一会儿再执行隐藏键盘的逻辑。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。原文链接http://blog.csdn.net/adayabetter?viewmode=contents https://blog.csdn.net/adayabetter/article/details/79976871
个人分类: 工作总结
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭