Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

这篇具有很好参考价值的文章主要介绍了Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路:

要在 Android 应用中全局检测软键盘的弹起,您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时,布局树会发生变化,因此您可以在监听器中捕获这些变化。

以下是一个示例,展示如何在全局范围内检测软键盘的弹起:

import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private View rootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rootView = findViewById(R.id.rootView); // Replace with your root layout's ID

        // Register a global layout listener
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // Get the height of the visible display area
                Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);
                int screenHeight = rootView.getHeight();
                int keyboardHeight = screenHeight - rect.bottom;

                // If the keyboard height is greater than a threshold (e.g., 100 pixels), the keyboard is likely visible
                if (keyboardHeight > 100) {
                    // Keyboard is visible, do something
                } else {
                    // Keyboard is hidden, do something else
                }
            }
        });
    }
}

在上面的代码中,rootView 是您布局的根视图,您需要将其替换为您实际布局的根视图。addOnGlobalLayoutListener 方法用于注册一个监听器,当布局树发生变化时会调用 onGlobalLayout 方法。

onGlobalLayout 方法中,您可以通过比较屏幕高度和可见区域的底部位置来计算软键盘的高度。根据计算结果,您可以判断软键盘是否可见,并执行相应的操作。

以下是一个在项目中的实际示例,解决无限循环的示例:

private void changerBottomView() {
        binding.includedNoteMenu.fragmentLl.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
    

private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            //取得 rootView 可视区域
            binding.includedNoteMenu.fragmentLl.getWindowVisibleDisplayFrame(rect);
            //取得 rootView 不可视区域高度 (被其他View遮挡的区域高度)
            int rootInvisibleHeight = binding.includedNoteMenu.fragmentLl.getRootView().getHeight() - rect.bottom;
            LogUtil.i("shawn","rootInvisibleHeight = " + rootInvisibleHeight);
            ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)binding.includedNoteMenu.fragmentLl.getLayoutParams();
            if (layoutParams.bottomMargin != rootInvisibleHeight + UiUtil.dp2px(10)) {
                layoutParams.bottomMargin = rootInvisibleHeight + UiUtil.dp2px(10);
                binding.includedNoteMenu.fragmentLl.setLayoutParams(layoutParams);
            }

        }
    };

日志: 只会多调用一次,在第二次回调时,条件已不满足,不会再调用setLayoutParams文章来源地址https://www.toymoban.com/news/detail-673021.html

I/shawn: [ main: AddNoteFragment.java:173 onGlobalLayout ] - rootInvisibleHeight = 840
I/shawn: [ main: AddNoteFragment.java:173 onGlobalLayout ] - rootInvisibleHeight = 840
I/shawn: [ main: AddNoteFragment.java:173 onGlobalLayout ] - rootInvisibleHeight = -4
I/shawn: [ main: AddNoteFragment.java:173 onGlobalLayout ] - rootInvisibleHeight = -4

到了这里,关于Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt实现全局键盘事件监听器-Windows

    更多精彩内容 👉个人内容分类汇总 👈 👉Qt自定义模块、工具👈 Qt版本:V5.12.5 兼容系统: Windows:这里测试了Windows10,其它的版本没有测试; Linux:这里测试了ubuntu18.04、20.04,其它的没有测试; Mac:等啥时候我有了Mac电脑再说。 有时候我们想获取到全局键盘事件,使用

    2024年02月09日
    浏览(35)
  • 【教程&整活】python第三方库pynput全局键盘监听+demo“ikun键盘”

    本篇文章主要讲pynput的键盘监听,以及一个demo“ikun键盘程序” 1.1 pynput.keyboard.Listener 这是pynput的子模块keyboard中的一个类,keyboard子模块都是关于键盘操作和监听的 Listener类有两个重要的构造参数,也是我们使用最多的: 一般在程序中我们这么使用: 按下或者松开按键所触

    2024年02月12日
    浏览(29)
  • Android 键盘监听 键盘展开/收起监听

    Android 键盘的展开与收起一直是个很遭人诟病的东西 方法各式各样都有,但是基本都不是很好用,有各种限制 这里编写了一个优雅地实现方式,利用屏幕实际高度与显示区域的高度对比可以优雅地判断出是否弹出键盘. 众所周知键盘是会侵占实际应用的显示区域,导致实际显示区域

    2024年02月12日
    浏览(29)
  • Android状态栏布局隐藏的方法

    2024年01月23日
    浏览(30)
  • Android 11 定制系统全局监听触摸事件接口

    1.定义创建aidl接口(由于需要回调这里优先需要增加一个回调接口 ) frameworksbasecorejavaandroidappIOnTouchListener.aidl package android.app; oneway interface IOnTouchListener {      void onTouchEvent( int action); }   2.新增调用接口 在 base/core/java/android/view/IWindowManager.aidl 修改如下: import android.ap

    2023年04月08日
    浏览(45)
  • echarts图表动态监听dataZoom滑动,控制柱条的宽度以及数值的显示隐藏

    当数值过多时,显示所有柱条看着会很凌乱且文字会挤在一起,于是就需要监听datazoom的滑动,拿到对应的阈值后做出相应的配置。 “ dataZoom ” 事件通常用于响应用户对图表进行数据缩放的操作。 这里是datazoom官网api地址:点击跳转至官网文档的datazoom介绍 初始时 状态如下

    2024年04月13日
    浏览(35)
  • ECharts图表动态修改series显示隐藏

    最近做的大数据平台,里面很多部分用到了ECharts,其中有个功能,要求将图表分组,根据用户选择的组,来确定ECharts要显示那些线条和柱子,也就是动态的显示option.series。 找了一下EChart的文档,发现可以通过控制option.legend.selected,来动态设置,无论饼图、折线图、还是柱

    2024年02月10日
    浏览(28)
  • android:登录界面,输入框输入数量达到了之后自动隐藏键盘。

    一、前言: 这篇文章是关于当我们输入账号密码时,达到11位(自定义)时,自动隐藏键盘。 二、上代码: 界面布局: 对应的Activity:LoginMainActivity 新建一个工具类:ViewUtil

    2024年02月12日
    浏览(34)
  • Android EditText的setOnEditorActionListener方法——监听软键盘按键

    1、控件EditText的setOnEditorActionListener方法的使用 setOnEditorActionListener这个方法,并不是在我们点击EditText的时候触发,也不是在我们对EditText进行编辑时触发,而是在我们编辑完之后点击软键盘上的各种键才会触发。 通过 布局文件 中的imeOptions可以控制软件盘右下角的按钮显示

    2024年02月10日
    浏览(34)
  • H5界面键盘弹起,整个界面上移

    说下基本的问题,就是点击选择门店,会从下面弹出一个弹框,出现门店列表,然后列表上方会有一个搜索框,搜索门店,当点击搜索框时会弹起键盘,导致整个弹框上移,可能会导致搜索框跳出整个界面,如下图所示,如果字体或整个界面过大,搜索框就会跳出可视区域

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包