为了账号安全,请及时绑定邮箱和手机立即绑定

android 输入法显示和隐藏问题

标签:
Android

恍惚间已经毕业五年了,仿佛才刚毕业之前也断断续续学过很多JAVA、python、shell、android。奈何学得过于浅显,也没好好做过总结。为了日后复习,以后碰到的问题争取都记录上,方便他人的同时也为自己定个里程。

今天偷个懒把之前的东西拿出来,实在太晚了哈!不过这个绝对是精华贴,不对的地方希望指教~
注: 有些代码可能是在网上看到的

<activity
android:windowSoftInputMode=["stateUnspecified",

                         "stateUnchanged", "stateHidden",

                         "stateAlwaysHidden", "stateVisible",

                         "stateAlwaysVisible","adjustUnspecified",

                         "adjustResize", ">

</activity>

  • 当有焦点产生时,软键盘是隐藏还是显示
    是否减少活动主窗口大小以便腾出空间放软键盘

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

默认不显示输入法
方法一:
在androidManifest里面设置
android:windowSoftInputMode="adjustUnspecified|stateHidden"


方法二:

EditText edit=(EditText)findViewById(R.id.edit); 
edit.clearFocus();    //测试无效

方法三: 测试无效
强制隐藏Android输入法窗口

EditText edit=(EditText)findViewById(R.id.edit); 
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(edit.getWindowToken(),0);  

这个不是无效如果放在监听里面可以实现,如果直接写在onCreate里面可能会被后面的操作覆盖

ll_layout.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        imm.hideSoftInputFromWindow(mEd_text.getWindowToken(), 0);
            return false;
        }
    });

方法四:
mEd_text.setInputType(InputType.TYPE_NULL); 测试有效,不过一直不显示点击也不显示
先看一个属性android:inputType:指定输入法的类型,int类型,可以用|选择多个。取值可以参 考:android.text.InputType类。取值包括:text,textUri,
phone,number,等.
Android SDK中有这么一句话“If the given content type is TYPE_NULL then a soft keyboard will not be displayed for this text view”,
先将EditText的InputType改变为TYPE_NULL,输入法就不会弹出.然后再设置监听,再重新设置它的InputType
和这个效果一样mEd_text.setFocusable(false);

方法五:
让父项目得到焦点 有效

android:focusable="true"
android:focusableInTouchMode="true"

方法六: 有效 不许放在另外一个按钮的监听如果在EditText的监听中加入这个代码输入法会弹出后再隐藏

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        ll_layout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //有效
//              imm.hideSoftInputFromWindow(mEd_text.getWindowToken(), 0);
                //有效  如果显示就隐藏,如果隐藏就显示
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
                return false;

            }
        });
----------------------------------------------------------------------------------
点击其他地方隐藏输入法
@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {  
            View v = getCurrentFocus();  
            if (isShouldHideInput(v, ev)) {  

                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
                if (imm != null) {  
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  
                }  
            }  
            return super.dispatchTouchEvent(ev);  
        }  
        // 必不可少,否则所有的组件都不会有TouchEvent了  
        if (getWindow().superDispatchTouchEvent(ev)) {  
            return true;  
        }  
        return onTouchEvent(ev);  
    }

    public  boolean isShouldHideInput(View v, MotionEvent event) {  
        if (v != null && (v instanceof EditText)) {  
            int[] leftTop = { 0, 0 };  
            //获取输入框当前的location位置  
            v.getLocationInWindow(leftTop);  
            int left = leftTop[0];  
            int top = leftTop[1];  
            int bottom = top + v.getHeight();  
            int right = left + v.getWidth();  
            if (event.getX() > left && event.getX() < right  
                    && event.getY() > top && event.getY() < bottom) {  
                // 点击的是输入框区域,保留点击EditText的事件  
                return false;  
            } else {  
                return true;  
            }  
        }  
        return false;  
    }
点击查看更多内容
31人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消