android监听软键盘的弹出与隐藏的示例代码

发布时间 - 2026-01-10 23:12:36    点击率:

情境:布局文件中有ScrollView,ScrollView中有个EditView,布局底部有一个控件(见下面布局代码),程序一启动EditView就获取焦点,弹出软键盘,将这个底部的控件也顶上去了,感觉不太好,所以我就想监听下软键盘弹出,此时去隐藏底部控件,软键盘隐藏时则显示底部控件。

初始:

     

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  android:id="@+id/activity_main"
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:fitsSystemWindows="true"
  tools:context="com.test.myapplication.MainActivity">

  <TextView
    android:layout_margin="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"/>

  <LinearLayout
    android:id="@+id/lin"
    android:background="#0000ff"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">
    <ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <EditText
          android:layout_width="match_parent"
          android:layout_height="wrap_content"/>
      </LinearLayout>
    </ScrollView>
  </LinearLayout>
  <TextView
    android:layout_margin="10dp"
    android:id="@+id/txt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"/>
</LinearLayout>

Android api提供了使得软键盘的弹出与隐藏的方式,比如

if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED)
    {
     //隐藏软键盘
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    }

但是并未提供监听软键盘的弹出与隐藏的方法。

由于弹出与隐藏软键盘势必会引起layout布局的变化,监听布局的变化然后计算偏移,即可算出是否时显示或隐藏,有两种解决方案。

1、自定义View,修改OnLayout()方法,比如

public class ResizeLayout extends LinearLayout {
  private InputListener mListener;

  public interface InputListener {
    void OnInputListener(boolean isHideInput);
  }

  public void setOnResizeListener(InputListener l) {
    mListener = l;
  }

  public ResizeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  private boolean mHasInit = false;
  private boolean mHasKeyboard = false;
  private int mHeight;

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    super.onLayout(changed, l, t, r, b);
    if (!mHasInit) {
      mHasInit = true;
      mHeight = b;
      System.out.println("mHeight= " + b);
    }
    else {
      mHeight = mHeight < b ? b : mHeight;
    }

    if (mHasInit && mHeight > b) { // mHeight代表键盘的真实高度 ,b代表在窗口中的高度 mHeight>b
      mHasKeyboard = true;
      mListener.OnInputListener(false);
    }
    if (mHasInit && mHasKeyboard && mHeight == b) { // mHeight = b
      mHasKeyboard = false;
      mListener.OnInputListener(true);
    }
  }

2、在activity中获取ViewGroup的高度变化

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /*// 隐藏标题栏
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    // 隐藏状态栏
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);*/
    setContentView(R.layout.activity_main);
    final LinearLayout lin = (LinearLayout) findViewById(R.id.lin);
    final TextView txt = (TextView) findViewById(R.id.txt);

    lin.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        Rect rect = new Rect();
        lin.getWindowVisibleDisplayFrame(rect);
        int rootInvisibleHeight = lin.getRootView().getHeight() - rect.bottom;
        Log.d(TAG, "lin.getRootView().getHeight()=" + lin.getRootView().getHeight() + ",rect.bottom=" + rect.bottom + ",rootInvisibleHeight=" + rootInvisibleHeight);
        if (rootInvisibleHeight <= 100) {
        //软键盘隐藏啦
          txt.postDelayed(new Runnable() {
            @Override
            public void run() {
              txt.setVisibility(View.VISIBLE);
            }
          },100);
        } else {
          ////软键盘弹出啦
          txt.setVisibility(View.GONE);
        }
      }
    });
  }

题外话:测试时发现通过设置全屏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);也可以达到相同目的,但是全屏就违背了我的初衷。个人推荐第二种方法,因为遇到一个客户的设备在开启指纹识别的相册锁时,第一种方法不好使。

在查资料的过程中看到有些开发者希望软键盘弹出时把底部控件顶上去的情形,方法同上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # 软键盘监听  # 软键盘弹出和隐藏监听  # 安卓监听软键盘弹出  # Android中监听软键盘显示状态实现代码  # Android监听软键盘弹出与隐藏的两种方法  # Android项目类似淘宝 电商 搜索功能  # 监听软键盘搜索事件  # 延迟自动搜索  # 以及时间排序的搜索历史记录的实现  # Android App实现监听软键盘按键的三种方式  # Android 监听软键盘状态的实例详解  # Android监听键盘状态获取键盘高度的实现方法  # 弹出  # 种方法  # 全屏  # 有个  # 去了  # 中有  # 也可  # 自定义  # 有两种  # 大家多多  # 我就想  # 过程中  # 有一个  # 顶上去  # 标题栏  # 时则  # 状态栏  # 窗口中  # 以达到  # 不太好 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 焦点电影公司作品,电影焦点结局是什么?  Laravel怎么为数据库表字段添加索引以优化查询  微信小程序 input输入框控件详解及实例(多种示例)  Mybatis 中的insertOrUpdate操作  香港服务器部署网站为何提示未备案?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Android仿QQ列表左滑删除操作  如何在云服务器上快速搭建个人网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel集合Collection怎么用_Laravel集合常用函数详解  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  魔方云NAT建站如何实现端口转发?  Laravel distinct去重查询_Laravel Eloquent去重方法  如何在VPS电脑上快速搭建网站?  如何用IIS7快速搭建并优化网站站点?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  java获取注册ip实例  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  个人网站制作流程图片大全,个人网站如何注销?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  JS中对数组元素进行增删改移的方法总结  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  JavaScript Ajax实现异步通信  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  zabbix利用python脚本发送报警邮件的方法  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何使用查询构建器?(Query Builder高级用法)  如何用AWS免费套餐快速搭建高效网站?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  js实现获取鼠标当前的位置  jQuery 常见小例汇总  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Python自动化办公教程_ExcelWordPDF批量处理案例  如何在Ubuntu系统下快速搭建WordPress个人网站?  微信小程序 wx.uploadFile无法上传解决办法  高性价比服务器租赁——企业级配置与24小时运维服务