要设置弹出键盘是否覆盖Activity的view,或者软键盘的显示隐藏状态,须要用到Activity的一个属性:java
android:windowSoftInputModeandroid
该属性在AndroidManifest.xml中设置,以下:app
<activity android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] …… > </activity>
值-----描述 | |
"stateUnspecified"-----软键盘的状态 (是否它是隐藏或可见 )没有被指定。系统将选择一个合适的状态或依赖于主题的设置。ide 这个是为了软件盘行为默认的设置。布局 |
|
"stateUnchanged"-----软键盘被保持不管它上次是什么状态,是否可见或隐藏,当主窗口出如今前面时。 | |
"stateHidden"-----当用户选择该 Activity时,软键盘被隐藏——也就是,当用户肯定导航到该 Activity时,而不是返回到它因为离开另外一个 Activity。 | |
"stateAlwaysHidden"-----软键盘老是被隐藏的,当该 Activity主窗口获取焦点时。 | |
"stateVisible"-----软键盘是可见的,当那个是正常合适的时 (当用户导航到 Activity主窗口时 )。 | |
"stateAlwaysVisible"-----当用户选择这个 Activity时,软键盘是可见的——也就是,也就是,当用户肯定导航到该 Activity时,而不是返回到它因为离开另外一个Activity。 | |
"adjustUnspecified"-----它不被指定是否该 Activity主 窗口调整大小以便留出软键盘的空间,或是否窗口上的内容获得屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖因而否窗口的内容有任何布局 视图可以滚动他们的内容。若是有这样的一个视图,这个窗口将调整大小,这样的假设可使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为 设置。 | |
"adjustResize"-----该 Activity主窗口老是被调整屏幕的大小以便留出软键盘的空间 | |
"adjustPan"-----该 Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能老是看到输入内容的部分。这个一般是不指望比调整大小,由于用户可能关闭软键盘以便得到与被覆盖内容的交互操做。 |
下面就是正题了。目前经手的项目有聊天界面,须要作成相似QQ聊天室当键盘显示的时候表情栏隐藏,(因为我的布局问题致使各类键盘监听事件都没办完全隐藏掉表情栏);思路以下,获取键盘状态是否显示。显示状态,判断表情有没有显示,若是显示就隐藏,没显示就不作动做。键盘消失状态,点击表情按钮,键盘消失表情显示,spa
第一种房间比较简单:code
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); if(imm.hideSoftInputFromWindow(editText.getWindowToken(), 0)) { imm.showSoftInput(editText,0); //软键盘已弹出 } else { //软键盘未弹出 }
可是这种在多布局状况fragment使用众多的状况好像很差使。
orm
在看第二种 须要本身去定义个布局文件:server
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; } } }); } }
用法xml
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 } } });