解决Android编辑框在全屏模式下无法检测布局变化的问题

本文主要是介绍解决Android编辑框在全屏模式下无法检测布局变化的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解决Android编辑框在全屏模式下无法检测布局变化的问题       
        分类:            Android 225人阅读 评论(0) 收藏 举报
android Android layout Layout 软键盘的显示和隐藏监听


铺垫的知识请看我的另一篇博客:Android软键盘的显示和隐藏

[java] view plain copy print ?
  1. package com.jqbar; 
  2.  
  3. import android.content.Context; 
  4. import android.util.AttributeSet; 
  5. import android.util.Log; 
  6. import android.widget.FrameLayout; 
  7.  
  8. public class MyFrameLayout extends FrameLayout{ 
  9.      
  10.     private onResizeListener listener; 
  11.      
  12.     public interface onResizeListener 
  13.     { 
  14.          void OnResize(int w, int h, int oldw, int oldh); 
  15.     } 
  16.      
  17.      public void setOnResizeListener(onResizeListener l) {  
  18.          listener = l; 
  19.      } 
  20.      
  21.     public MyFrameLayout(Context context, AttributeSet attrs) { 
  22.         super(context, attrs); 
  23.         // TODO Auto-generated constructor stub 
  24.     } 
  25.     @Override 
  26.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  27.         // TODO Auto-generated method stub 
  28.         super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
  29. //      Log.e("onMeasure ", "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec);  
  30.     } 
  31.     @Override 
  32.     protected void onLayout(boolean changed, int left, int top, int right, 
  33.             int bottom) { 
  34.         // TODO Auto-generated method stub 
  35.         super.onLayout(changed, left, top, right, bottom); 
  36.         Log.e("onLayout ", "=>OnLayout called! changed="+ changed+",l=" + left + ", t=" + top + ",r=" + right + ",b="+bottom);    
  37.         if(listener!=null
  38.         { 
  39.             listener.OnResize(left,top,right,bottom); 
  40.         } 
  41.     } 
  42.     @Override 
  43.     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
  44.         // TODO Auto-generated method stub 
  45.         super.onSizeChanged(w, h, oldw, oldh); 
  46. //       Log.e("onSizeChanged ", "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh);    
  47.     } 
  48.  
package com.jqbar;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.FrameLayout;public class MyFrameLayout extends FrameLayout{private onResizeListener listener;public interface onResizeListener{void OnResize(int w, int h, int oldw, int oldh);}public void setOnResizeListener(onResizeListener l) { listener = l;}public MyFrameLayout(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);
//		Log.e("onMeasure ", "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec); }@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {// TODO Auto-generated method stubsuper.onLayout(changed, left, top, right, bottom);Log.e("onLayout ", "=>OnLayout called! changed="+ changed+",l=" + left + ", t=" + top + ",r=" + right + ",b="+bottom);   if(listener!=null){listener.OnResize(left,top,right,bottom);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {// TODO Auto-generated method stubsuper.onSizeChanged(w, h, oldw, oldh);
//		 Log.e("onSizeChanged ", "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh);   }}

以上的代码在

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);设置全屏后,就算是布局改变了,但是onLayout函数里面相应的参数也不会改变。此时将无法通过检测参数的数值变化来监听软键盘的显示和隐藏,从而无法在显示和隐藏软键盘时实时改变自己的布局。


但是虽然传过来的参数是不对的,但是还是会调用相应的接口,所以通过相应的设置一些参数,并且根据我们程序的特点来限定各种状态,从而能够实现软键盘的显示和隐藏的监听。这就是我的总的思路

[java] view plain copy print ?
  1. if(msg.what == MSG_HIDESOFTINPUT) 
  2.         { 
  3.             if(showSoftInput&&!bCallTextEdit) 
  4.             { 
  5.                 mScrollView.scrollBy(0, 50-dy); 
  6.                                 showSoftInput = false
  7.             } 
  8.             else if(showSoftInput&&bCallTextEdit) 
  9.             { 
  10.                 callTimeCount += 1
  11.                 if(callTimeCount == 2
  12.                 { 
  13.                 bCallTextEdit = false
  14.                 callTimeCount = 0
  15.                 } 
  16.             } 
 if(msg.what == MSG_HIDESOFTINPUT){if(showSoftInput&&!bCallTextEdit){mScrollView.scrollBy(0, 50-dy);showSoftInput = false ;}else if(showSoftInput&&bCallTextEdit){callTimeCount += 1;if(callTimeCount == 2){bCallTextEdit = false;callTimeCount = 0;}}


其中的showSoftInput 和bCallTextEdit为boolean类型

这里的想法是: 当弹出软键盘时showSoftInput和bCallTextEdit都为true,此时我们修改我们的布局,并且弹出软键盘时会监听到布局变化,会执行

                    callTimeCount += 1;
                    if(callTimeCount == 2)
                    {
                    bCallTextEdit = false;
                    callTimeCount = 0;
                    }

这些语句,此时onLayout会被调用两次,所以用callTimeCount来记数,然后设置bCallTextEdit 为false,这时的状态是软键盘为显示状态。


点击隐藏软键盘时会执行这些语句

if(showSoftInput&&!bCallTextEdit)
                {
                      mScrollView.scrollBy(0, 50-dy);//这里我们就可以恢复我们的布局了
                      showSoftInput = false ;

               }



整体的思路就是这样,我们不能通过onLayout参数的改变来监听我们的布局改变,那么我们自己来设置参数来控制相应的状态,从而实现实时监听。具体的细节就不再叙述了,感觉写的有点乱。

这篇关于解决Android编辑框在全屏模式下无法检测布局变化的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069234

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec