`
jiapeng16
  • 浏览: 35735 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android WebView 文本框获取焦点后自动放大的解决方案

 
阅读更多

    2013-10-14 更新:最近好久没弄android 了,webview的问题其实如果是在android4.0以上的版本,本文说的文本框放大本身是可以通过调整html body的大小来解决的,建议body不写死或者body比webview小。下文所说的办法针对个版本android 都有效,但是实际上使用会很局限,实际上你要先知道html的body大小 和webview的大小来算,并非什么完美解决方法,只在特定情况下适合。

 

     Android WebView 当文本框获取焦点后自动放大,但这种自动放大不是我想要的。这并不是android的bug,而是他的正常处理

    这是我最近两个星期面临的一个比较棘手的Bug,目前国内外都没有大牛提供很好的解决方式。这里,我今天花了大半天时间来解决这个问题。

 

     之所以出现这种情况,主要是当文本框获取到焦点后,键盘自动弹出,会执行WebView的displaySoftKeyboard 方法,这个方法会把缩小的网页恢复到正常情况(也就是说缩小的网页放大),但是我目前的项目都是不允许页面缩放的,所以一旦页面放大后就无法恢复。 这里感谢国外的一个朋友的帖子回复

http://stackoverflow.com/questions/3702805/is-there-a-way-to-disable-the-zoom-feature-on-input-fields-in-webview/7214199#7214199 。

 

不多说,直接上代码,如果想知道原因,看我后续的blog。 <!--EndFragment-->

<!--EndFragment-->

 

解决原理:

通过反射,拿到WebView的一个私有属性mDefaultScale,并在WebView失去焦点的时候,修改它的值,已达到网页不放大的效果。

 

 

     view.setInitialScale(???); //???代表随便多少,小于一百才会有我说的这个bug。

 

 

<!--EndF-->

   解决方案如下:

 

		videoNavigation_WV.setOnFocusChangeListener(new View.OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				if(hasFocus)
				{
					try {
						Field defaultScale = WebView.class.getDeclaredField("mDefaultScale");
						defaultScale.setAccessible(true);
						//WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f 是我的程序的一个方法,可以用float 的scale替代
						defaultScale.setFloat(videoNavigation_WV , WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f);
					} catch (SecurityException e) {
						e.printStackTrace();
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					} catch (NoSuchFieldException e) {
						e.printStackTrace();
					} 
				}
			}
		});

  <!--EndFragmen-->

   大家如果想利用我这段代码,我这里面的defaultScale.setFloat(WebView,float),这个float值是你初始化的时候的scale值。跟你的CSS body值有一定的关系。假如body值 是1920*1080 而你现在是显示在1280*720的屏幕上,那么这个scale 的float值就是0.666667。就是你的现在的缩放页面与正常情况先显示的大小的比(缩放比),大家可以用页面第一次加载的时候通过getScale()值获取。

   

    代码还有很多需要优化的地方,比如反射拿属性,其实只要做一次,设置可以做多次,这里只是一个Demo,觉得代码垃圾的话我发个改好的工程给你。

 

   有木有做android TV 的 ,加群87154410,欢迎欢迎。 

 

2013-10-14 对了,加群直接私聊我的,最近比较忙,没时间帮你解决,不好意思,群里也有解决过此类问题的。

 

 

 

 

4
1
分享到:
评论
7 楼 dinglongaaa 2014-05-27  
setOnFocusChangeListener这个方法根本就没走
6 楼 ggoyea 2013-03-06  
不起作用呢。
5 楼 fengpengfei8910 2012-12-19  
Field defaultScale = WebView.class.getDeclaredField("mDefaultScale");  
执行到这一句抛出异常 求解决
4 楼 fengpengfei8910 2012-12-19  
写不很不错 但还是求工程 fengpengfei11@163.com
3 楼 gejian311 2012-05-17  
我执行时直接NoSuchFieldException异常了,为什么呢?
2 楼 Pirate001 2012-03-09  
   
1 楼 vivaman 2012-01-11  

相关推荐

    android webview input=file 失效解决方案

    在Android开发中,Webview是一个重要的组件,它允许我们在原生应用中内嵌网页内容,提供混合式应用的用户体验。然而,在使用Webview时,有时会遇到一个问题:当HTML页面中包含`&lt;input type="file"&gt;`用于上传文件的...

    Android WebView获取源码

    本文将详细介绍如何在Android中使用`WebView`来获取网页的源码,并封装成一个自定义的`ArthurWebView`组件。 首先,我们了解`WebView`的基本用法。`WebView`继承自`View`,主要通过以下步骤进行初始化: 1. 在布局...

    Android Webview滑动监听

    本篇将详细讲解如何在Android Webview中实现滑动监听以及图片的放大缩小功能。 首先,我们要了解`WebView`的基本用法。在Android Studio中,创建一个新的布局XML文件,添加`WebView`组件: ```xml &lt;WebView ...

    Android通过JS在线用webview加载PDF文件(无限放大版本)

    本教程将详细讲解如何在Android的Webview中加载在线PDF文件,并且实现无限放大功能。 首先,我们需要了解WebView的基本用法。WebView是Android SDK提供的一种组件,用于在应用程序内显示网页内容。我们可以使用`...

    android Webview读取网页里的所有图片,并实现点击放大

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。当涉及到用户界面交互,特别是展示包含图片的网页时,我们可能需要实现一些额外的功能,比如点击图片放大查看。本篇文章...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    实例详解Android Webview拦截ajax请求

    Android Webview 拦截 Ajax 请求的详细讲解 Android Webview 提供了页面加载及资源请求的钩子,但是对于 H5 的 Ajax 请求并没有提供干涉的接口。这意味着我们不能在 Webview 中干涉 JavaScript 发起的 HTTP 请求,...

    Android WebView 去除标题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。有时候,我们可能希望去除WebView中的标题部分,以实现更自定义化的界面设计。本篇文章将详细探讨如何在Android的...

    android webview实现自身下载文件自动保存SDCARD

    而“android webview实现自身下载文件自动保存SDCARD”这个话题则涉及到如何在WebView中处理文件下载,并且让这些文件自动保存到设备的外部存储(通常是SDCARD)中,而且整个过程对用户来说是透明的,即静默下载。...

    android webview播放网页视频

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和展示网页内容。当涉及到在Webview中播放网页视频时,这个问题可能会变得稍微复杂,因为Android原生的Webview并不总是支持所有现代HTML5视频特性。...

    Android webview调用摄像头扫描二维码

    本文将详细讲解如何在Android Webview中调用摄像头进行二维码扫描,并结合ZXing(Zebra Crossing)解析包进行二维码的解析。 首先,让我们了解Android Webview的基本用法。Webview是Android SDK提供的一种视图组件...

    Android中实现WebView点击图片放大显示

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序中嵌入网页内容。在某些场景下,用户可能需要查看WebView加载的网页中的图片,此时,提供一个点击图片放大显示的功能会大大提升用户体验...

    android webview加载网页获取对应url 参数值的方法(csdn)————程序.pdf

    本文将详细讲解如何在Android的WebView中加载网页,并获取URL参数值的方法。 首先,我们要明白WebView的基本使用。创建一个WebView可以通过以下代码: ```java WebView webView = new WebView(this); webView....

    Android WebView 缓存详解

    Android WebView 缓存详解 一. 两种缓存类型: 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器 的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地...

    Android WebView播放视频(包括全屏播放)

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现类似浏览器的功能。本文将详细讲解如何在Android的WebView中播放视频,包括全屏播放的实现方法。以下是对该主题的...

    Android Webview视频播放器

    在Android平台上,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容。这个项目"Android Webview视频播放器"是利用Webview来实现HTML5视频播放功能的示例。以下是对这个项目的详细解读: 1. **...

    android webview 版本69.0

    在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页浏览功能,而无需启动完整的浏览器应用。在给定的标题“android webview 版本69.0”中,提到的是一个特定版本的WebView,即69.0。...

    android webview 图片上传 4.4解决方案 防js注入webview

    Android Webview upload 图片上传 ! 导读: Android HTML 打开相册上传照片 ...解决 android webview 在4.4系统上无法使用情况 博客地址 : http://blog.csdn.net/aaawqqq/article/details/51087805

    Android WebView另类实现 自由复制进入选择文字模式

    在Android开发中,WebView是一个非常重要的组件,它允许我们在原生应用中展示网页内容,提供了一种混合式应用开发的解决方案。本篇文章将深入探讨如何在Android WebView中实现自由复制和选择文字的功能,这对于增强...

    Android webview加载网页.zip

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,无需跳转到外部浏览器。这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解...

Global site tag (gtag.js) - Google Analytics