Android开发 输入法调用学习

方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)

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

方法二(view为接受软键盘输入的视图,SHOW_FORCED表示强制显示)

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED); 
imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘

自动弹出输入法

mCommentEdittext.setFocusable(true);
mCommentEdittext.setFocusableInTouchMode(true);
mCommentEdittext.requestFocus();
InputMethodManager inputManager = (InputMethodManager) mCommentEdittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(mCommentEdittext, 0);

调用隐藏系统默认的输入法

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken()
      , InputMethodManager.HIDE_NOT_ALWAYS);
WidgetSearchActivity是当前的Activity
注意!以上的隐藏是调用activity的getCurrentFocus().getWindowToken().但是,这个调用在华为品牌的手机上会出现空指针报错.所以为了适配华为最安全的写法还是添加一个view,如下:
mInputMethodManager.hideSoftInputFromWindow(mContentView.getWindowToken()
                        , InputMethodManager.HIDE_NOT_ALWAYS);//隐藏输入法
 

获取输入法打开的状态

这个方法有点不太可靠

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开

 计算屏幕的方式监听输入法是否打开

碎片里调用

private void initGlobalLayoutListener(){
        mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
                    int mScreenHeight = 0;
                    int mKeyboardHeight = 0;
                    @Override
                    public void onGlobalLayout() {

                        Rect rect = new Rect();
                        // 测量当前窗口的显示区域
                        ((Activity)getContext()).getWindow().getDecorView()
                                .getWindowVisibleDisplayFrame(rect);
                        if(mScreenHeight <= 0){
                            mScreenHeight = ((WindowManager) getContext()
                                    .getSystemService(Context.WINDOW_SERVICE))
                                    .getDefaultDisplay().getHeight();
                        }
                        //计算出软键盘的高度
                        int keyboardHeight = mScreenHeight - rect.bottom;

                        //如果keyboardHeight大于屏幕的五分之一,
                        // 此时keyboardHeight有效,反之就是软键盘已经关闭了。
                        if (Math.abs(keyboardHeight) > mScreenHeight / 5) {
                            mKeyboardHeight = keyboardHeight;
                            L.e("已经触发键盘");
                        }else {
                            L.e("没有触发键盘");


                        }
                    }
                };
        mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);//给xml里的根布局设置监听
    }

正常activity调用

private void initGlobalLayoutListener(){
        mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
            int mScreenHeight = 0;
            int mKeyboardHeight = 0;
            @Override
            public void onGlobalLayout() {

                Rect rect = new Rect();
                // 测量当前窗口的显示区域
                DemoActivity.this.getWindow().getDecorView()
                        .getWindowVisibleDisplayFrame(rect);
                if(mScreenHeight <= 0){
                    WindowManager windowManager = (WindowManager) DemoActivity.this.getSystemService(Context.WINDOW_SERVICE);
                    mScreenHeight = windowManager.getDefaultDisplay().getHeight();

                }
                //计算出软键盘的高度
                int keyboardHeight = mScreenHeight - rect.bottom;

                //如果keyboardHeight大于屏幕的五分之一,
                // 此时keyboardHeight有效,反之就是软键盘已经关闭了。
                if (Math.abs(keyboardHeight) > mScreenHeight / 5) {
                    mKeyboardHeight = keyboardHeight;
                    L.e("已经触发键盘");
                }else {
                    L.e("没有触发键盘");
                }
            }
        };
        mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);//给xml里的根布局设置监听
    }

记得移除监听

@Override
    public void onPause() {
        super.onPause();
        mRootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(mGlobalLayoutListener);
    }

进入activity就要显示输入法

在清单文件对应的activity配置中加入一句Android:windowSoftInputMode="stateVisible|adjustResize"

根据输入法位置改变,改变输入框位置

android:windowSoftInputMode的值adjustPan或者adjustResize即可,像这样:

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustPan"  >
    ...
</activity>

 

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

end

posted on 2019-06-24 11:49  观心静 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/guanxinjing/p/11076295.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果要在 Android ROM 开发中修改默认输入法,可以按照以下步骤进行: 1. 下载 Android 源码,使用 Android Studio 等 IDE 进行编译。 2. 打开源码中的 AndroidManifest.xml 文件,在其中添加以下代码: ``` <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.settings"> <application> <service android:name=".inputmethod.InputMethodAndSubtypeEnabler" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.VOICE_LAUNCH" /> </intent-filter> <meta-data android:name="android.settings.APP_NAME" android:resource="@string/input_method_settings_label" /> <meta-data android:name="android.settings.TOP_LEVEL_SETTINGS" android:value="true" /> </service> </application> </manifest> ``` 这段代码定义了一个名为 InputMethodAndSubtypeEnabler 的服务,用于启用输入法和子类型。其中,android:name 属性指定了服务的名称,android:permission 属性指定了服务需要的权限,android:exported 属性指定服务是否可以被其他应用调用。meta-data 标签用于指定服务的名称和是否为顶级设置。 3. 在 Android 源码中找到输入法应用程序的代码,修改其中的默认设置。 4. 编译源码,并将编译后的系统镜像刷入目标设备。 需要注意的是,修改默认输入法需要具备一定的 Android 系统开发经验,建议在熟悉 Android 开发的前提下进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值