最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

Android软键盘的用法总结

开发进阶 AndroidChina 5835浏览 0评论

1. 软键盘的显示原理

软键盘其实是一个Dialog。InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统会对当前的主窗口进行调整,以便留出相应的空间来显示该Dialog在底部,或者全屏。

2. 活动主窗口调整

Android定义了一个属性windowSoftInputMode, 用它可以让程序控制活动主窗口调整的方式。我们可以在配置文件AndroidManifet.xml中对Activity进行设置。这个属性的设置将会影响两件事情:
1>软键盘的状态——隐藏或显示。
2>活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。
故该属性的设置必须是下面列表中的一个值,或一个“state…”值加一个“adjust…”值的组合。在任一组设置多个值,各个值之间用|分开。

“stateUnspecified”: 软键盘的状态(隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是软件盘行为的默认设置。
“stateUnchanged”:软键盘被保持上次的状态。
“stateHidden”:当用户选择该Activity时,软键盘被隐藏。
“stateAlwaysHidden”: 软键盘总是被隐藏的。
“stateVisible”: 软键盘是可见的。
“stateAlwaysVisible”: 当用户选择这个Activity时,软键盘是可见的。
“adjustUnspecified”: 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。也就是说,系统自动决定是采用平移模式还是压缩模式,决定因素在于内容是否可以滚动。
“adjustResize”:(压缩模式) 当软键盘弹出时,要对主窗口调整屏幕的大小以便留出软键盘的空间。
“adjustPan”:(平移模式:当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时,窗口就会进行平移。也就是说,该模式始终是保持输入框为可见。)该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

3. 侦听软键盘的显示隐藏

有时候,借助系统本身的机制来实现主窗口的调整并非我们想要的结果,我们可能希望在软键盘显示隐藏的时候,手动的对布局进行修改,以便使软键盘弹出时更加美观。这时就需要对软键盘的显示隐藏进行侦听。
我们可以借助软键盘显示和隐藏时,对主窗口进行了重新布局这个特性来进行侦听。如果我们设置的模式为压缩模式,那么我们可以对布局的onSizeChanged函数进行跟踪,如果为平移模式,那么该函数可能不会被调用。

4. EditText默认不弹出软件键盘

方法一:
在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden
例如:

<activity android:name=".Main"
       android:label="@string/app_name"
       android:windowSoftInputMode="adjustUnspecified|stateHidden"
       android:configChanges="orientation|keyboardHidden">
       <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
</activity>

方法二:
让EditText失去焦点,使用EditText的clearFocus方法
例如:

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);

5.EditText始终不弹出软件键盘

EditText edit=(EditText)findViewById(R.id.edit);
edit.setInputType(InputType.TYPE_NULL);

在代码中实现软键盘隐藏\显示

1、绑定软键盘到EditText

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

2、去除软键盘显示

editMsgView.setText("");
editMsgView.clearFocus();
//close InputMethodManager
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0);

3、EditText始终不弹出软件键盘

EditText edit=(EditText)findViewById(R.id.edit); edit.setInputType(InputType.TYPE_NULL);
或者
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm.isActive()){   //这里可以判断也可以不判断
     imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0 );
}

4、在设置软键盘弹出属性界面加载后,软键盘不能弹出,不能弹出软键盘的主要原因是Android程序未将屏幕绘制完成,所以延迟一定时间,弹出软键盘

方法A;

private Handler hander=new Handler(){
      public void handleMessage(android.os.Message msg) {
            edit.setFocusable(true);
            edit.setFocusableInTouchMode(true);
            edit.requestFocus();
            InputMethodManager inputManager = (InputMethodManager)edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.showSoftInput(edit, 0);
      };
};

@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
     if(visible){
           hander.sendEmptyMessageDelayed(0, 1000);
     }
}

方法B;

Timer timer = new Timer();
timer.schedule(new TimerTask() {
      @Override
      public void run() {
           InputMethodManager m = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
           m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
      }
}, 300);

显示和隐藏软键盘

tv.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            //隐藏软键盘 //
            imm.hideSoftInputFromWindow(tv.getWindowToken(), 0);
            //显示软键盘 //
            imm.showSoftInputFromInputMethod(tv.getWindowToken(), 0);
            //切换软键盘的显示与隐藏
            imm.toggleSoftInputFromWindow(tv.getWindowToken(), 0, InputMethodManager.HIDE_NOT_ALWAYS);
            //或者 //
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
       }
});

1,Eidtext这个控件默认是你点击了它获得焦点之后就会自动地弹出软键盘,前提是你在竖屏的时候。但横盘的时候,不会自动弹出弹出软键盘了。
模拟器横屏时默认是打开了键盘的所以就算你用代码来显示软键盘也是显示不出来的,而像真实的手机(有物理键盘(硬件盘)比如G1)就不一样了。可以通过sensor来把画面横屏而并没正在的将键盘打开时就可以通过代码来显示软键盘了。
2,问题在通过代码来使得软键盘显示与隐藏时可以写在某控件的onClick事件里来或者用timer来控制,若你直接在onCreate或onResume里面是不行的,从网上找来的理由说是:软件盘是要在所有view画完才能显示的。第一种情况:
Java代码

@Override
protected void onResume() {
      // TODO Auto-generated method stub
      super.onResume();
      InputMethodManager im = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
      im.showSoftInput(tv, 0);
}

第二种情况:
Java代码

tv.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
           // TODO Auto-generated method stub
           InputMethodManager im = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
           if (im.showSoftInput(tv, InputMethodManager.SHOW_FORCED)) {
                  System.out.println(” return is true fullscreenmode” + im.isFullscreenMode());
           } else {
                  System.out.println(” return is not true”);
           }
       }
});

3,自定义软键盘的Enter键

SDK升级到1.5以后,当文本输入框(EditText及其子类)获得焦点后,会弹出系统自带的软键盘
为了实现一些自定义的功能,就稍微研究了下
* 当layout中有多个EditText,把每个控件的android:singleLine的属性都被设置成true的情况下,软键盘的Enter键上 的文字会变成“Next”,按下后下个EditText会自动获得焦点(实现了“Next”的功能);当最后一个控件获得焦点的时候,Enter键上的文 字会变成“Done”,按下后软键盘会自动隐藏起来
* 把EditText的Ime Options属性设置成不同的值,Enter键上可以显示不同的文字或图案
actionNone : 回车键,按下后光标到下一行
actionGo : Go,
actionSearch : 一个放大镜
actionSend : Send
actionNext : Next
actionDone : Done,隐藏软键盘,即使不是最后一个文本输入框示例:

<EditText android:text=""
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:inputType="text"
          android:id="@+id/edit1"/>
<EditText android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:id="@+id/edit2"
          android:imeOptions="actionSend" //发送
          android:inputType="text|textEmailAddress"/>
<EditText android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:id="@+id/edit3"
          android:imeOptions="actionDone"  //确定
          android:inputType="number|numberSigned|numberDecimal"/>

//--------------------------------------------------------------------------------------------------

edit1.setOnEditorActionListener(onEditorActionListener);
edit2.setOnEditorActionListener(onEditorActionListener);
edit3.setOnEditorActionListener(onEditorActionListener);

private OnEditorActionListener onEditorActionListener = new OnEditorActionListener() {

      @Override
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
           switch(actionId){
           case EditorInfo.IME_NULL:
                  System.out.println("null for default_content: " + v.getText() );
                  break;
           case EditorInfo.IME_ACTION_SEND:
                  System.out.println("action send for email_content: "  + v.getText());
                  break;
           case EditorInfo.IME_ACTION_DONE:
                  System.out.println("action done for number_content: "  + v.getText());
                  break;
       }
       return true;
}
};

转载请注明:Android开发中文站 » Android软键盘的用法总结

您必须 登录 才能发表评论!