android 焦点放大,Android 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。

解决原理:

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

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

解决方案如下:

Java代码  96d8c6b2dda13f0cf7f411e38d674ffd.pngvideoNavigation_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();

}

}

}

});  

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

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

有木有做android TV 的 ,加群87154410,欢迎欢迎。 博客刚开始写,希望大家支持。

写都比较简略,大家可以提建议,欢迎留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值