解决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

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖