Android输入法API及如何强制修改默认输入法

 1 //输入法选择器

    final InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.showInputMethodPicker();


    2  禁止输入法在当前View的软键盘弹出,如禁止EditText弹出输入法,可以重写EditText的OnTouch方法并实现下面的方法

   if (imm != null && imm.isActive(this)) {

            imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);

        }

  

   3 显示软键盘

      imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

      关闭软键盘
      imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

      当前焦点软键盘

private boolean hideSoftInputFromWindow() {
if (mSearchTextView != null) {
mSearchTextView.clearFocus();
}
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null && getActivity().getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),          InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
return false;
}

      


 4//获取系统默认的输入法IME

   String defaultIme = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);


     如系统默认的Android键盘IIME 为 "com.android.inputmethod.latin/.LatinIME"

        谷歌拼音为"com.android.inputmethod.pinyin/.PinyinIME"


    5显示系统中的输入法列表


    List<InputMethodInfo> InputMethods = imm.getEnabledInputMethodList();//比如系统中有Android键盘.谷歌拼音,搜狗输入法

      String IMEName = InputMethods.get( 1 ).getServiceName();//获取第一个输入法IME


 6 强制修改默认输入法,前提必须在系统源码中修改或在system\apps中的apk,修改后需重新编译代码,并增加Settings 和Settings Secure读写权限

     如:   谷歌拼音为"com.android.inputmethod.pinyin/.PinyinIME"

      String IMEName="com.android.inputmethod.pinyin/.PinyinIME";

     Settings.Secure.putString( getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD, IMEName );


    7 Activity AndroidManifest配置      如:android:windowSoftInputMode="stateAlwaysHidden|adjustNothing">

     

   当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不     能获取焦点输入。

    解决办法:

     方法一:在你的activity中的oncreate中setContentView之前写上这个代码                  getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

    方法二:在项目的AndroidManifest.xml文件中界面对应的<activity>里加入android:windowSoftInputMode="stateVisible|adjustResize",这样会让屏幕整体上移。如果加上的是

                android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。


     "stateUnspecified"

     这个是软件盘行为默认的设置。软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。



    " stateUnchanged"

     当主窗口出现在前面时,软键盘被保持它上次是什么状态,无论上次是可见或隐藏。



     "stateHidden"

   当用户选择该Activity时,软键盘被隐藏——也就是说,当用户确定导航到该Activity时,不管他离开的Activity的软键盘是可见还是隐藏都会被隐藏,   不过当用户离开一个Activity而导致另一个被覆盖的Activity显示出来时,软键盘会使用默认的设置。



"stateAlwaysHidden"

当该Activity主窗口获取焦点时,软键盘总是被隐藏的,不管是确认导航到该Activity还是Activity被覆盖后显示出来。



"stateVisible"

当用户导航到Activity主窗口时,软键盘是可见的。不过当用户离开一个Activity而导致另一个被覆盖的Activity显示出来时,软键盘会使用默认的设置。



"stateAlwaysVisible"

当该Activity主窗口获取焦点时,软键盘总是显示的,不管是确认导航到该Activity还是Activity被覆盖后显示出来。



"adjustUnspecified"

这个是软件盘行为默认的设置。它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。



"adjustResize"

该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间

"adjustPan"

该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。



故而,我建议我们的配置中,统一使用如下设置:

android:windowSoftInputMode=" stateAlwaysHidden | adjustPan "


总结:

不希望遮挡设置activity属性android:windowSoftInputMode="adjustPan"

希望动态调整高度android:windowSoftInputMode="adjustResize"

 

问题:

我原来的问题是,对于腾讯微博的OAuth验证webView,弹出软键盘后,输入框上移就看不到输入框了,后发现Webview放到了ScrollView中,将ScrollView改为LinearLayout问题解决了,不会在弹出软键盘后大幅滚动。不过下面还是详细介绍下软键盘和activity页面遮挡的问题。

 

详细:

通常情况下如果我们在一个输入框输入内容,输入法键盘弹出时,activity自动设置高度,相当于在activity向上滚动了添加了输入法键盘的高度。但有时可能淹没当前的输入框,如果希望输入法键盘弹出时不自动向上挤压activity,在activty中设置属性android:windowSoftInputMode="adjustPan"即可,如下:

  1. <activity android:name="testActivity"  
  2.       android:windowSoftInputMode="adjustPan">  

设置属性为android:windowSoftInputMode="adjustResize"即可自动调整高度。

属性stateVisible表示默认显示输入法键盘,其他属性见:android:windowSoftInputMode

 

adjustPan同样存在问题,即可能需要关闭软键盘,定位被挡住的输入框,我希望的是介于adjustPan和adjustResize之间的解决方案,即软键盘会对activity有一定挤压,但是焦点所在输入框始终会显示在屏幕上,有会的朋友欢迎留言分享,个人觉得可能的解决方案是new一个LinearLayout,重写其中的

  1. protected void onSizeChanged(int w, int h, int oldw, int oldh)  

你可能感兴趣的:(Android输入法API及如何强制修改默认输入法)