`

android软键盘的用法总结

阅读更多

Android软键盘的用法总结

 

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

 

 

此效果自定义的一个键盘输入,见附件工程。
 

 

  • 大小: 33.5 KB
分享到:
评论
1 楼 zxw13651485 2014-07-16  
自定义键盘输入,这个demo不错,就是不知道能否在所有主流手机都适用?

相关推荐

    android软键盘上添加一个按钮

    首先,理解Android软键盘的工作原理。软键盘是通过系统的InputMethodService服务实现的,它是一个抽象的服务类,用于创建自定义输入法。然而,系统默认的软键盘并不允许开发者直接在其上添加自定义元素。为了实现在...

    android监听软键盘状态

    综上所述,监听Android软键盘状态可以通过比较布局高度变化或观察`WindowInsets`来实现。开发者应根据实际需求选择合适的方法,并注意性能优化。以上代码示例仅供参考,实际使用时需根据项目具体情况进行调整。

    Android软键盘与聊天页面底部布局之间优雅地切换

    首先,我们需要理解Android软键盘对布局的影响。当用户点击输入框时,软键盘通常会覆盖屏幕底部的部分内容,这可能会遮挡聊天窗口的输入框或发送按钮。为了解决这个问题,Android提供了几种处理策略。 1. **调整...

    Android判断软键盘是否弹出

    在实际应用中,除了通过`onLayout`方法,还可以使用其他方式来检测软键盘状态,比如监听`WindowInsets`的变化,或者利用`InputMethodManager`来判断。 在提供的压缩包文件`SoftKeyboardListenDemo`中,很可能包含了...

    android软键盘上移动焦点

    本文将深入探讨如何在Android软键盘上实现焦点移动,并支持上下左右按键以及回车键输入,以拉丁IME(LatinIME)输入法为例。 首先,焦点移动的关键在于监听和处理键盘事件。为了实现在软键盘上移动焦点,需要重写`...

    Android自定义软键盘

    总结,创建一个Android自定义软键盘需要对Android的输入法框架有深入理解,涉及到`InputMethodService`、`Keyboard`类以及布局设计等多个方面。通过自定义布局和逻辑,我们可以实现独特的键盘样式和交互效果,满足...

    5种方法完美解决android软键盘挡住输入框方法详解

    本文将详细介绍5种有效的方法来解决软键盘挡住输入框的问题,并讨论它们的适用场景、优缺点以及使用注意事项。 1. **方法一:非透明状态栏下使用`adjustResize`和`adjustPan`** - `adjustResize`:当键盘弹出时,...

    Android 实现软键盘与EditText的交互.zip

    综上所述,这个压缩包提供了关于Android软键盘与EditText交互的解决方案,包括如何控制键盘显示、布局调整、工具类库的使用等,对于优化用户体验具有重要的实践意义。开发者可以参考这些内容,根据自己的应用需求...

    android软键盘把布局顶上去问题

    如果布局是在Fragment中,可以尝试在软键盘弹出时使用`FragmentTransaction`的`setCustomAnimations()`方法,配合动画效果,使内容区域平滑地上移。 6. **使用 CoordinatorLayout 和 AppBarLayout**: 对于使用了...

    android软键盘状态判断DEMO

    本DEMO——"android软键盘状态判断DEMO"提供了一个解决方案,它能判断软键盘的显示状态,并且对外提供了一个状态改变的接口,使得开发者可以方便地监听到软键盘的动态变化。 首先,软键盘状态的判断通常是通过观察...

    Android软键盘返回键监听.zip

    总之,监听Android软键盘的返回键事件是一项实用的功能,能够帮助开发者更好地控制用户在应用中的交互流程。无论是通过InputMethodManager,还是通过观察ViewTreeObserver,或者是自定义键盘事件,都有其适用的场景...

    Android软键盘学习资料

    以下是对“Android软键盘学习资料”中涉及的知识点的详细解析: 1. **Android软键盘的显示与隐藏**: - 当用户在EditText输入时,系统会自动弹出软键盘。开发者可以通过`android:windowSoftInputMode`属性在...

    Android 解决软键盘遮挡登陆按钮

    解决软键盘遮挡登录按钮的方法主要有以下几种: 1. 使用`android:windowSoftInputMode="adjustResize"`: 在AndroidManifest.xml中,为对应的Activity设置此属性,系统会在软键盘弹出时尝试调整Activity窗口大小,...

    android 关闭软键盘

    ### Android关闭软键盘知识点详解 ...综上所述,通过上述两种方法可以在Android应用程序中有效地控制软键盘的显示与隐藏。选择合适的方法并合理地运用,可以帮助开发者构建出更加完善的应用程序。

    Android 设置一个底部控件view随着软键盘的弹出而上移

    在"Android 底部控件随软键盘弹出demo"这个项目中,可能包含了一个或多个上述方法的示例代码。通过查看`SoftKeyboardUp`这个文件或者相关的源码,你可以看到具体的实现细节,包括布局文件、Java或Kotlin代码等。学习...

    Android监听输入法软键盘按键demo

    本文将深入探讨如何在Android应用中监听软键盘按键的三种方法,基于CSDN博主"zhufuing"的文章详情链接(已失效,但我们将根据常见实践进行讲解)。 ### 方法一:使用EditText的TextWatcher `TextWatcher`是Android...

    Android Dialog与软键盘的正确打开方式

    此外,有时我们需要控制软键盘的显示和隐藏,可以使用以下方法: - `InputMethodManager`类提供了控制软键盘显示和隐藏的功能。例如,调用`InputMethodManager imm = (InputMethodManager) context....

    android 监听软键盘状态(弹起还是收起)

    在Android开发中,有时我们需要监听软键盘的打开与关闭状态,比如在聊天界面或搜索框等场景下,以便做出相应的布局调整。虽然Android SDK并没有提供直接的API来监听软键盘的状态,但我们可以通过一些技巧来实现这个...

    Android自定义输入法软键盘

    在Android平台上,自定义输入法软键盘是一种常见的需求,它允许开发者为特定的应用或设备创建个性化的输入体验。本文将深入探讨如何在Android系统中实现一个自定义输入法,主要基于提供的博客链接——《Android...

Global site tag (gtag.js) - Google Analytics