Android 如何判断软键盘弹出还是隐藏

预备知识:

在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文件中的设置为如下形式:

[html] view plain copy

  1. <activity  
  2.     android:name="com.bear.softkeyboardlistener.MainActivity"  
  3.     android:label="@string/app_name"  
  4.     android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >  
  5.     <intent-filter>  
  6.         <action android:name="android.intent.action.MAIN" />  
  7.   
  8.         <category android:name="android.intent.category.LAUNCHER" />  
  9.     </intent-filter>  
  10. </activity>  


 

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

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

[java] view plain copy

  1. import com.bear.bearbroadcastreceiver.R;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnLayoutChangeListener;  
  7. import android.widget.Toast;  
  8.   
  9. public class MainActivity extends Activity implements OnLayoutChangeListener{  
  10.       
  11.     //Activity最外层的Layout视图  
  12.     private View activityRootView;  
  13.     //屏幕高度  
  14.     private int screenHeight = 0;  
  15.     //软件盘弹起后所占高度阀值  
  16.     private int keyHeight = 0;  
  17.       
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         activityRootView = findViewById(R.id.root_layout);  
  24.         //获取屏幕高度  
  25.         screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();  
  26.         //阀值设置为屏幕高度的1/3  
  27.         keyHeight = screenHeight/3;  
  28.     }  
  29.       
  30.     @Override  
  31.     protected void onResume() {  
  32.         super.onResume();  
  33.           
  34.         //添加layout大小发生改变监听器  
  35.         activityRootView.addOnLayoutChangeListener(this);  
  36.     }  
  37.       
  38.     @Override  
  39.     public void onLayoutChange(View v, int left, int top, int right,  
  40.             int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {  
  41.           
  42.         //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值  
  43.           
  44. //      System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);  
  45. //      System.out.println(left + " " + top +" " + right + " " + bottom);  
  46.           
  47.           
  48.         //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起  
  49.         if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){  
  50.               
  51.             Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();  
  52.           
  53.         }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){  
  54.               
  55.             Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();  
  56.           
  57.         }  
  58.           
  59.     }

连接https://blog.csdn.net/mk00126/article/details/76356025

猜你喜欢

转载自blog.csdn.net/yijiaodingqiankun/article/details/81085167