你的位置:首页 > 操作系统

[操作系统]两种简单方式监听软键盘是否弹出


//该Activity的最外层LayoutfinalView activityRootView = findViewById(R.id.activityRoot); //给该layout设置监听,监听其布局发生变化事件activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){  @Override  publicvoid onGlobalLayout(){    //比较Activity根布局与当前布局的大小    int heightDiff = activityRootView.getRootView().getHeight()- activityRootView.getHeight();    if(heightDiff >100){    //大小超过100时,一般为显示虚拟键盘事件       }else{    //大小小于100时,为不显示虚拟键盘或虚拟键盘隐藏    }   }});

heighDiff的大小不同的手机值就不同,可以打印log值来查看,然后再确定写出自己需要的值

 Log.d(TAG, "getRootView().getHeight():" + frameLayout.getRootView().getHeight() + ""); Log.d(TAG, "getHeight():" + frameLayout.getHeight() + ""); Log.d(TAG, "heightDiff:" + heightDiff + "");

 

 

第二种:

在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

那么这里值的含义列表如下:

 

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【C】stateHidden:用户选择activity时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

 

示例:

(1)首先我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:

<activity   android:name="com.bear.softkeyboardlistener.MainActivity"   android:label="@string/app_name"   android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >   <intent-filter>     <action android:name="android.intent.action.MAIN" />      <category android:name="android.intent.category.LAUNCHER" />   </intent-filter> </activity> 

 

这样设置之后,当有软键盘弹起来的时候,Activity的布局大小会被压缩上去,但是你仍然可以通过滑动浏览所有。

 

(2)我们要为Activity的最外面的Layout设置一个OnLayoutChangeListener监听器:

import com.bear.bearbroadcastreceiver.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnLayoutChangeListener;import android.widget.Toast;public class MainActivity extends Activity implements OnLayoutChangeListener{    //Activity最外层的Layout视图  private View activityRootView;  //屏幕高度  private int screenHeight = 0;  //软件盘弹起后所占高度阀值  private int keyHeight = 0;    @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    activityRootView = findViewById(R.id.root_layout);    //获取屏幕高度    screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();    //阀值设置为屏幕高度的1/3    keyHeight = screenHeight/3;  }    @Override  protected void onResume() {    super.onResume();        //添加layout大小发生改变监听器    activityRootView.addOnLayoutChangeListener(this);  }    @Override  public void onLayoutChange(View v, int left, int top, int right,      int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {        //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值    //    System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);//    System.out.println(left + " " + top +" " + right + " " + bottom);            //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起    if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){            Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();        }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){            Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();        }      }

这种方式详情见:http://blog.csdn.net/bear_huangzhen/article/details/45896333