android 键盘状态,获取键盘显示和隐藏

原创
2015/01/18 11:15
阅读数 1.6K

要设置弹出键盘是否覆盖Activity的view,或者软键盘的显示隐藏状态,需要用到Activity的一个属性:

android:windowSoftInputMode

该属性在AndroidManifest.xml中设置,如下:

<activity android:windowSoftInputMode=["stateUnspecified",  
                                    "stateUnchanged", "stateHidden",  
                                    "stateAlwaysHidden", "stateVisible",  
                                    "stateAlwaysVisible", "adjustUnspecified",  
                                    "adjustResize", "adjustPan"] …… >  
</activity>


值-----描述

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

这个是为了软件盘行为默认的设置。


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

"stateHidden"-----当用户选择该 Activity时,软键盘被隐藏——也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个 Activity

"stateAlwaysHidden"-----软键盘总是被隐藏的,当该 Activity主窗口获取焦点时。

"stateVisible"-----软键盘是可见的,当那个是正常合适的时 (当用户导航到 Activity主窗口时 )

"stateAlwaysVisible"-----当用户选择这个 Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个Activity

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

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

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


下面就是正题了。目前经手的项目有聊天界面,需要做成类似QQ聊天室当键盘显示的时候表情栏隐藏,(由于个人布局问题导致各种键盘监听事件都没办彻底隐藏掉表情栏);思路如下,获取键盘状态是否显示。显示状态,判断表情有没有显示,如果显示就隐藏,没显示就不做动作。键盘消失状态,点击表情按钮,键盘消失表情显示,

第一种房间比较简单:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);   
if(imm.hideSoftInputFromWindow(editText.getWindowToken(), 0))  {  
     imm.showSoftInput(editText,0);  
    //软键盘已弹出  
}  else  {  
    //软键盘未弹出  
}

但是这种在多布局情况fragment使用众多的情况好像不好使。

在看第二种 需要自己去定义个布局文件:

package com.demo.softkeyboard;  
  
import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.EditText;  
import android.widget.TextView;  
  
/** 
 * 软键盘监听Demo 
 * @author qiaoning 
 * 
 */  
public class SoftKeyboardListenDemoActivity extends Activity {  
      
    private EditText editText;  
    KeyboardListenRelativeLayout relativeLayout;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout);  
        editText = (EditText) findViewById(R.id.editText);  
          
        relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() {  
              
            public void onKeyboardStateChanged(int state) {  
                switch (state) {  
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://软键盘隐藏   
                    editText.setVisibility(View.VISIBLE);  
                    break;  
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://软键盘显示   
                    editText.setVisibility(View.GONE);  
                    break;  
                default:  
                    break;  
                }  
            }  
        });  
    }  
}

    用法

import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.EditText;  
import android.widget.TextView;  
  
/** 
 * 软键盘监听Demo 
 * @author qiaoning 
 * 
 */  
public class SoftKeyboardListenDemoActivity extends Activity {  
      
    private EditText editText;  
    KeyboardListenRelativeLayout relativeLayout;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout);  
        editText = (EditText) findViewById(R.id.editText);  
          
        relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() {  
              
            public void onKeyboardStateChanged(int state) {  
                switch (state) {  
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://软键盘隐藏   
                    editText.setVisibility(View.VISIBLE);  
                    break;  
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://软键盘显示   
                    editText.setVisibility(View.GONE);  
                    break;  
                default:  
                    break;  
                }  
            }  
        });  
    }  
}

最后布局文件

<?xml version="1.0" encoding="utf-8"?>  
<com.demo.softkeyboard.KeyboardListenRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/keyboardRelativeLayout"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
    <ScrollView android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
        android:fillViewport="true">  
        <LinearLayout android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:orientation="vertical">  
            <EditText android:id="@+id/editText"  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content"/>  
        </LinearLayout>  
    </ScrollView>  
</com.demo.softkeyboard.KeyboardListenRelativeLayout>

最后就是第三种方法,目前就是用这个种方式代替前面两种:相对简单

首先需要拿到Activity最外面的layout的布局

final View activityRootView = findViewById(R.id.activityRoot);  
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
    @Override  
    public void onGlobalLayout() {  
        int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();  
        if (heightDiff > 100) { // 如果高度差超过100像素,就很有可能是有软键盘...  
            ... do something here  
        }  
     }  
});


展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部