android 对软键盘的显示和消失监听

本文介绍了如何在Android中监听和处理软键盘的显示和消失。通过设置`android:windowSoftInputMode="adjustResize"`使Activity根据软键盘状态调整布局。在`onCreate()`中添加全局布局监听器,当高度差超过200dp时判断为软键盘显示,反之则为隐藏。同时,为防止EditText自动获取焦点弹出软键盘,可在父布局中设置`android:focusable="true"`和`android:focusableInTouchMode="true"`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先在配置文件中添加
android:windowSoftInputMode="adjustResize"  意思是activity会根据软键盘的显示和消失始终调节布局的大小
2.
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);

        rl.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = rl.getRootView().getHeight() - rl.getHeight();
                if (heightDiff > dpToPx(MainActivity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
                    // ... do something here
                    Log.d("TAG","aaaa");//显示
                }else {
                    Log.d("TAG","bbbb");//消失

                }
            }
        });
    }
//    COMPLEX_UNIT_DIP
    public static float dpToPx(Context context, float valueInDp) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
    }
3.这时候进入程序会发现输入法会自动弹出,是应为exidtext自动获取了焦点,在父布局添加如下代码
android:focusable="true"
android:focusableInTouchMode="true"

4.现在就可以完美的监听软键盘的显示和消失了

Android开发中,监听软键盘显示隐藏是一个常见的需求。由于 Android 系统并没有直接提供针对软键盘状态变化的 API,因此我们通常会通过间接的方式来实现这一功能。 ### 方案一:基于 `ViewTreeObserver.OnGlobalLayoutListener` 这个方案是利用布局的变化来判断键盘是否弹出或收起: ```java final View rootView = findViewById(android.R.id.content); rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { private final int originalHeight; { Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); originalHeight = r.bottom; } @Override public void onGlobalLayout() { // 获取当前屏幕可视区域的高度 Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); // 计算键盘高度 int keyboardHeight = originalHeight - r.bottom; if (keyboardHeight > 0) { // 键盘已打开 System.out.println("Keyboard is shown"); } else { // 键盘关闭了 System.out.println("Keyboard is hidden"); } // 移除监听器防止多次触发 rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); ``` 需要注意的是,这种方式依赖于整个Activity窗口尺寸改变事件,在某些特定场景下可能会不够准确,例如当底部导航栏消失时也会影响结果。 ### 方案二:使用 WindowInsets 从 Android P(API level 28) 开始引入了一个新的机制叫做WindowInsets,可以更方便地检测系统UI元素如导航栏、状态栏以及输入法的状态变动: 对于API Level >= 30(Android R), 可以这样做: ```kotlin val decorView: View = window.decorView decorView.setOnApplyWindowInsetsListener { v, insets -> val imeInsetBottom = insets.getInsets(WindowInsets.Type.ime()).bottom if (imeInsetBottom == 0){ println("IME Hidden") }else{ println("IME Shown with $imeInsetBottom px height") } return@setOnApplyWindowInsetsListener insets } ``` 而对于低于此版本,则需要采用其他手段获取相应的信息。 以上就是两种常用的方法用于监听安卓设备上虚拟键盘(soft input method editor) 的展示与隐藏。选择哪种取决于您的应用最低支持的目标SDK版本及具体的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值