精华内容
下载资源
问答
  • 2020-12-24 02:04:31

    解决方法一:

    在所在的Activity中加入

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    解决方法二:

    1.调整AndroidManifest.xml

    找到对应的Activity,加入以下属性

    android:windowSoftInputMode="adjustResize"

    若此时Activity还有全屏属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen",则删除全屏属性。

    原因:软键盘弹出时,要对主窗口布局重新进行布局,并调用onSizeChanged方法,当设置为全屏模式,google官方有说明,会忽略输入框调整。

    2.布局xml调整

    WebView控件所在的布局,WebView祖先节点不能有ScrollView。另外,根节点不能固定高度。还有,当根节点是FrameLayout时,WebView本身、WebView父节点不能固定高度。

    h5软键盘挡住输入框问题解决(android)

    问题 移动端浏览器中的表单在部分android机型上测试,点击靠下的输入框时会遇到弹出的软键盘挡住输入框问题 ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第三方输入法 ...

    Android爬坑之旅:软键盘挡住输入框问题的终极解决方案

    前言 开发做得久了,总免不了会遇到各种坑.而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页面 ...

    android webview 输入法键盘遮挡输入框的问题

    新建一个工具类: /** * 解决webView键盘遮挡问题的类 * Created by zqy on 2016/11/14. */ public class KeyBoardListener { ...

    点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )

    测试移动端页面的时候,偶然发现点击底部input输入框时,弹出的虚拟键盘偶尔会挡住input输入框. 输入框固定在页面底部,如图所示:   input固定底部设计图.png 点击底部input输入框唤 ...

    Android各种键盘挡住输入框解决办法

    方法一:windowSoftInputMode:adjustResize和adjustPan 主要实现方法:在 AndroidManifest.xml 对应的Activity里添加 android:w ...

    Android软键盘与输入框的设置

    大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...

    flutter TextField 输入框被软键盘挡住的解决方案

    以前搞ionic1~4的开发中 和react-native   flutter中的机制完全不同, 在flutter 中 当前页面如果存在元素被软键盘挡住 的情况 页面元素的最外层肯定得嵌套一层   S ...

    Android中软键盘弹出时关于布局的问题

    当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入. 解决办法: 方法一:在你的activity中的oncre ...

    Android中软键盘弹出时底部菜单上移问题

    当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入. 解决办法: 方法一:在你的activity中的oncrea ...

    随机推荐

    Eclipse常用的快捷键

    Eclipse常用快捷键 1,       Ctrl+S,保存文档. 2,       Tab,多行同时右移:选中多行 3,       shlft+tab,多行同时左移,选中多行 4,       ...

    那些Xcode不能错过的插件

    转载来自网络   古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径!以下是搜集的一些有力的XCode插件.   1.全能搜索家CodePilot 2.0 你要找的 ...

    创建被访问的swf文件

    首先创建一个fla文件,名字叫movie.fla,在该文件库中放一个mc, 并将其拖放到舞台上,然后 命名为test_mc, 然后在库中给该mc绑定一个类,类名随意. 创建访问swf文件的swf文件 ...

    php调试工具总结

    一:XDebug+Webgrind 二:XHProf

    [Unity菜鸟] 术语

    HUD Mozilla  Mozilla基金会,简称Mozilla(缩写MF或MoFo),是为支持和领导开源的Mozilla项目而设立的一个非营利组织. 称作Mozilla公司的子公司,雇佣了一些Mo ...

    用PersonalRank实现基于图的推荐算法

    今天我们讲一个下怎么使用随机游走算法PersonalRank实现基于图的推荐. 在推荐系统中,用户行为数据可以表示成图的形式,具体来说是二部图.用户的行为数据集由一个个(u,i)二元组组成,表示为用户 ...

    C# winform 渐变效果

    在用到vs的兴奋过程中,想给程序做个启动画面,我采用了显示Aform,过一段时间,隐藏这个Aform,showdialog下一个Bform,closeAForm这个方法来做了,不知道大家有没有跟好的办 ...

    ps、top 、free查看用户资源信息

    查看root用户的进程信息. 运行命令: ps -u root 查看oracle用户的进程信息. 运行命令: ps -u oracle 若查看现在的资源占用情况,如何呢? 运行命令: top 可以 ...

    QT连接postgreSQL

    这是我之前项目遇到的问题,连接postgreSQL数据库,一直找不到引擎,最后终于找到 原因了,需要程序加载 1.安装postgresql客户端,2.需要配置postgresql客户端的bin和lib ...

    mysqlbinlog 工具分析binlog日志

    MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中:当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步 ...

    更多相关内容
  • 在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。像微信则直接把登录按钮做在输入框的...
  • 主要介绍了IOS 键盘挡住输入框的问题解决办法的相关资料,需要的朋友可以参考下
  • 而在Android开发的路上,『软键盘挡住输入框』这个坑,可谓是一个旷日持久的巨坑——来来来,我们慢慢看。 入门篇 最基本的情况,如图所示:在页面底部有一个EditText,如果不做任何处理,那么在软键盘弹出的时候...
  • 在使用ionic开发IOS系统微信的时候会有一个苦恼的问题,填写表单的时候键盘挡住输入框,其实并不算什么大问题,只要用户输入一个字就可以立刻看见输入框了。  可惜的是,有些客户是不讲理的,他才不管这个问题,...
  • Android键盘挡住输入框

    2019-04-19 01:01:26
    亲测可用,可以直接放到项目中进行使用 * 本来以为Actviity设置下android:windowSoftInputMode="adjustResize|...不行吧,我这边已经全部解决,键盘遮挡输入框,遮挡输入框下登录按钮,一 一解决了 简单操作,易扩展
  • 对于键盘挡住输入框,给出了多种方案,希望对大家有所帮助。在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,...

    对于键盘挡住输入框,给出了多种方案,希望对大家有所帮助。

    在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。像微信则直接把登录按钮做在输入框的上面,但有很多情况下,这经常满足不了需求。同时如果输入框特别多的情况下,点击输入时,当前输入框没被挡住,但是当前输入框下面的输入框却无法获取焦点,必须先把键盘收起,再去获取下面输入框焦点,这样用户体验也非常不好,那有什么办法呢?

    系统的 adjustResize 和 adjustPan 有什么区别,他们使用时的注意事项,有什么系统要求及蔽端呢?

    下面对几种在开发中常用的方法进行总结:

    方法一:windowSoftInputMode:adjustResize和adjustPan

    主要实现方法:在 AndroidManifest.xml 对应的Activity里添加 android:windowSoftInputMode=”adjustPan” 或是 android:windowSoftInputMode=”adjustResize”属性

    这两种属性的区别,官方的解释是:

    image

    这两个属性作用都是为了调整界面使键盘不挡住输入框 ,我这里对这两种属性使用场景、优缺点、注意事项进行了全方面总结,不知大家平时使用时是否注意到了。

    image

    adjustResize失效情况:activity 设置了全屏属性指 Theme.Light.NotittleBar.Fullscreen 或者设置了 activity 对应的主题中 android:windowTranslucentStatus 属性,设置方式为:android:windowTranslucentStatus=true,这时如果对应的页面上含有输入框,将会导致点击输入框时软键盘弹出后键盘覆盖输入框,导致输入框看不见。

    fitsSystemWindows=”true”,只有初始的view起作用:如果在布局中不是最外层控件设置 fitsSystemWindows=”true”, 那么设置的那个控件高度会多出一个状态栏高度。若有多个view设置了,因第一个view已经消耗掉 insect,其他 view 设置了也会被系统忽略。

    假设原始界面是一个 LinearLayout 包含若干 EditText,如下图所示,在分别使用两种属性时的表现:

    image

    1、adjustPan

    整个界面向上平移,使输入框露出,它不会改变界面的布局;界面整体可用高度还是屏幕高度,这个可以通过下面的截图看出,如点击 输入框6,输入框会被推到键盘上方,但 输入框1 被顶出去了,如果界面包含标题栏,也会被顶出去。

    image

    2、adjustResize

    需要界面的高度是可变的,或者说 Activity 主窗口的尺寸是可以调整的,如果不能调整,则不会起作用。

    例如:Activity 的xml布局中只有一个 LinearLayout 包含若干EditText,在Activity的 AndroidMainfest.xml 中设置 android:windowSoftInputMode=”adjustResize” 属性,点击 输入框6, 发现软键盘挡住了 输入框6,并没有调整,如下图所示:

    image.gif

    但使用这两种属性,我们可以总结以下几点:

    **1). **使用 adjustPan, 如果需要输入的项比较多时,点击输入框,当前输入项会被顶到软键盘上方,但若当前输入框下面还有输入项时,却需要先收起键盘,再点击相应的输入项才能输入。这样操作太繁琐了,对于用户体验不大好;

    **2). **adjustResize 的使用,需要界面本身可显示的窗口内容能调整,如果不能,不起作用;

    方法二:在界面最外层布局包裹ScrollView

    1、只使用ScrollView

    在相应界面的xml布局中,最外层添加一个 ScrollView,不在 AndroidMainfest.xml 中设置任何 android:windowSoftInputMode属性,此时点击输入框,输入框均不会被软键盘档住。即使当前输入框下方也有输入框,在键盘显示的情况下,也可以通过上下滑动界面来输入,而不用先隐藏键盘,点击下方输入框,再显示键盘输入。

    我们可以根据 Android Studio 的 Inspect Layout 工具来查看界面真正占用的布局高度,工具在:

    image.gif

    通过该工具,我们看到:

    界面真正能用的高度=屏幕高度-状态栏高度-软键盘高度

    界面中蓝框是真正界面所用的高度:

    image.gif

    2、ScrollView + adjustPan

    我们再在该类的 AndroidMainfest.xml 中设置 windowSoftInputMode属性 为 adjustPan:

    image.gif

    发现当前输入框不会被挡住,但是输入框比较多时,在有键盘显示时,界面上下滑动,但只能滑动部分,且如果输入框在界面靠下方时,点击输入框,标题栏也会被顶出去,如下图所示:

    image.gif

    我们借助 Inspect Layout 工具查看此设置布局可用高度,从下图可以看出,此时布局可用高度是屏幕的高度,上下滑动也只是此屏的高度,在 输入框9 以下的输入框滑不出来,向上滑动,也只能滑到 输入框1。

    image.gif

    3、ScrollView+adjustResize

    我们前面说过 adjustResize 的使用必须界面布局高度是可变的,如最外层套个 ScrollView 或是界面可收缩的,才起作用。这里在该类的 AndroidMainfest.xml 中设置windowSoftInputMode属性 为 adjustResize

    image.gif

    发现效果和 1 不设置任何 windowSoftInputMode属性 类似,其使用高度也是:屏幕高度-状态栏高度-软键盘高度

    image.gif

    我们再来看看 windowSoftInputMode 默认属性值 stateUnspecified:

    image.gif

    可以看出,系统将选择合适的状态,也就是在界面最外层包含一层 ScrollView 时,设置默认属性值 stateUnspecified 其实就是 adjustResize属性。

    但以下两方面无法满足需求:

    1). 当 Activity 设置成全屏 fullscreen 模式时或是使用沉浸式状态栏时,界面最外层包裹 ScrollView,当输入框超过一屏,当前输入框下面的输入框并不能上下滑动来输入,情况类似于 ScrollView+adjustPan,只能滑动部分,通过 Inspect Layout 也可以看到,界面可用高度是整个屏幕高度,并不会进行调整高度。即使设置 adjustResize,也不起作用。

    **2). **如果是类似于注册界面或是登录界面,键盘会挡住输入框下面的登录按钮。

    沉浸式状态栏下

    自android系统4.4(API>=19)就开始支持沉浸式状态栏,当使用 System windows(系统窗口)显示系统一些属性和操作区域,如最上方的状态及没有实体按键的最下方的虚拟导航栏。

    android:fitsSystemWindows=“true”会使得屏幕上的可布局空间位于状态栏下方与导航栏上方。

    方法三:当键盘弹起时,让界面整体上移;键盘收起,让界面整体下移

    使用场景:针对界面全屏或是沉浸式状态栏,输入框不会被键盘遮挡。主要用于一些登录界面,或是需要把界面整体都顶上去的场景。

    1、主要实现步骤

    (1). 获取Activity布局xml的最外层控件,如xml文件如下:

    image.gif

    先获取到最外层控件:

    RelativeLayout main = (RelativeLayout) findViewById(R.id.main);

    (2). 获取到最后一个控件,如上面的xml文件,最后一个控件是Button:

    Button login_btn = (Button) findViewById(R.id.login_btn);

    **(3). **给最外层控件和最后一个控件添加监听事件:

    image.gif

    2、实现原理

    此方法通过监听 Activity 最外层布局控件来检测软键盘是否弹出,然后去手动调用控件的 scrollTo方法 达到调整布局目的。

    方法四:监听Activity顶层View,判断软键盘是否弹起,对界面重新绘制

    此方法的实现来自android中提出的issue 5497

    使用场景:针对界面全屏或是沉浸式状态栏,界面包含比较多输入框,界面即使包裹了一层 ScrollView,在键盘显示时,当前输入框下面的输入不能通过上下滑动界面来输入。

    一、实现步骤

    1、把 SoftHideKeyBoardUtil类 复制到项目中;

    2、在需要使用的Activity的onCreate方法中添加 SoftHideKeyBoardUtil.assistActivity(this) 即可。

    二、实现原理

    SoftHideKeyBoardUtil类 具体代码如下:

    image.gif

    它的实现原理主要是:

    (1). 找到 Activity 的最外层布局控件,我们知道所有的 Activity 都是 DecorView,它就是一个 FrameLayout控件,该控件id是系统写死叫 R.id.content,就是我们 setContentView 时,把相应的 View 放在此 FrameLayout 控件里

    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);

    所以 content.getChildAt(0) 获取到的 mChildOfContent,也就是我们用 setContentView 放进去的 View。

    **(2). **给我们的 Activity 的xml布局View设置一个 Listener 监听:

    image.gif

    View.getViewTreeObserver() 可以获取一个 ViewTreeObserver对象——它是一个观察者,用以监听当前 View树 所发生的变化。这里所注册的 addOnGlobalLayoutListener,就是会在当前的 View树 的全局布局(GlobalLayout)发生变化、或者其中的 View 可视状态有变化时,进行通知回调。『软键盘弹出/隐 』都能监听到。

    **(3). **获取当前界面可用高度

    image

    如下图所示:

    image

    **(4). **重设高度, 我们计算出的可用高度,是目前在视觉效果上能看到的界面高度。但当前界面的实际高度是比可用高度要多出一个软键盘的距离的。

    通过上面的这种方法,一般布局输入键盘挡住输入框的问题基本都能解决。即使界面全屏或是沉浸式状态栏情况。

    总结

    下面对上面几种方法进行对比:

    方法一:

    优点:使用简单,只需在Activity的AndroidMainfest.xml中设置windowSoftInput属性即可。

    注意点:adjustResize属性必须要界面大小可以自身改变;

    缺点:当输入框比较多时,当前输入框下方的输入框会初键盘挡住,须收起键盘再进入输入;使用adjustPan,输入框较多时,因它是把界面当成一个整体,只会显示一屏的高度,会把ActionBar顶上去。

    方法二:

    优点:使用简单,只需在Activity的最外层布局包裹一个ScrollView即可。

    注意点:不可使用adjustPan属性,否则ScrollView失效;

    缺点:对于全屏时,在键盘显示时,无法上下滑动界面达到输入的目的;

    方法三:

    优点:可以解决全屏时,键盘挡入按钮问题。

    缺点:只要有此需求的Activity均需要获取到最外层控件和最后一个控件,监测键盘是否弹出,再调用控件的scrollTo方法对界面整体上移或是下移。代码冗余。

    方法四:

    优点:可以解决全屏时,键盘挡入输入框问题。只需要写一个全局类,其他有需求的界面直接在onCreate方法里调用此类的全局方法,即可。

    缺点:多用了一个类。

    综上所述:

    当输入框比较少时,界面只有一个输入框时,可以通过方法一设置adjustPan;

    如果对于非全屏/非沉浸式状态栏需求,只需要使用方法二即可;

    如果全屏全屏/沉浸式状态栏界面只有一个类有键盘挡入输入框需求,可使用方法三;

    如果大部分界面均使用全屏或沉浸式状态栏,且有此需求,则选择方法四更恰当。

    展开全文
  • 键盘挡住输入框解决办法

    千次阅读 2019-07-19 15:39:34
     为什么要随时监测屏幕大小,这是因为我们在手机端的时候,常常会遇到这样的问题:当点击输入框的时候,手机的键盘就会自动浮现,它会使得页面的可视示高度(document.body.clientHeight)发生变化。而我们的输入框...

    为什么?  

      为什么要随时监测屏幕大小,这是因为我们在手机端的时候,常常会遇到这样的问题:当点击输入框的时候,手机的键盘就会自动浮现,它会使得页面的可视示高度(document.body.clientHeight)发生变化。而我们的输入框就被可怜的遮挡在小键盘后面

    怎么办?

    方法1

      我们不知道小键盘何时会出现,但有一点是可以确定的,当小键盘出现的时候,body的可视区域一定为发生变化!!当我们检测到页面的可视高度发生了变化,我们就可以确定手机的键盘出来了。于是我们就可以使用document.getElementById('×××××').scrollIntoView();把被小键盘遮挡住的输入框给上移到可视区域。

    Ps:结合scrollIntoView()使用的还有activeElement当我们页面有多个input输入框时,我们可以使用HTML5的辅助管理DOM功能,document.activeElement属性始终会引用DOM当前获得的焦点元素。可以获得当前用户焦点的元素。

    1

    document.activeElement.scrollIntoView();

    监测手机小键盘弹出代码:

    1

    2

    3

    4

    5

    6

    7

    window.onresize = () => {

        // 注意,return返回的函数为立即执行函数!!

        return (() => {

            window.screenHeight = document.body.clientHeight;

            this.showHeight = window.screenHeight;

        })()

    }

    当我拿到showHeight,在vue里,我就可以通过watch他的变化,然后再执行相应的逻辑代码,使用Vue.js完整代码如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    data() {

        return {

            // 默认屏幕高度

            docmHeight: document.documentElement.clientHeight,

            showHeight: document.documentElement.clientHeight,

        }

    // 渲染后执行

    mounted() {

        window.onresize = () => {

            return (() => {

                window.screenHeight = document.body.clientHeight;

                this.showHeight = window.screenHeight;

            })()

        }

    },

    watch: {

        showHeight: 'inputType',

    },

    methods: {

        // 检测屏幕高度变化

        inputType() {

             if (!this.timer) {

                 this.timer = true

                 let that = this

                 setTimeout(() => {

                     if (that.docmHeight > that.showHeight) {

                         that.inputfile = false;

                         if (document.activeElement.className === 'weui-textarea') {

                             document.getElementById('applyNote').scrollIntoView(); // 输入框的id为applyNote,class为weui-textarea

                         }

                     else if (that.docmHeight <= that.showHeight) {

                         that.inputfile = true;

                     }

                     that.timer = false;

                 }, 20)

            }

        }

    }

    方法2

    设置相对定位,通过top来使输入框到达合适的位置

    1.js拿不到键盘的弹出和收起事件;

    2.覆盖一层的键盘弹出方式不会触发window.resize事件和onscroll事件。

     getElementOffsetTop(el) {
        let top = el.offsetTop
        let cur = el.offsetParent
        while(cur != null){
              top += cur.offsetTop
              cur = cur.offsetParent
       }
       return top
      }
    
      componentDidMount() {
        const u = navigator.userAgent
        const isAndroid=u.indexOf('Android')>-1||u.indexOf('Linux')>-1;//android终端
        // alert('android'+isAndroid)
        if(isAndroid){ // android统一处理,不影响ios的自身处理
          const body = document.getElementsByTagName('body')[0] // 兼容获取body
    
          const regDom = document.querySelector('.wrapper_register') // 获取页面根元素
          const content = document.querySelector('.content') // 表单内容部分
    
          // const scrollHeight = body.scrollHeight // 网页文档高
          // const scrollTop = body.scrollTop// 卷上去的高
    
          const clientHeight = body.clientHeight //可见高
          const fixHeight = clientHeight/3 // 定位高,弹出键盘时input距浏览器上部的距离,自己定义合适的
    
          // 符合需弹出键盘的元素query
          const queryStr = 'input[type="text"], input[type="tel"], input[type="password"], textarea'
          const inputs = content.querySelectorAll(queryStr)
    
          // console.log(inputs)
    
          const offsetTopArr = Array.prototype.map.call(inputs,item=>{
            return this.getElementOffsetTop(item) // offsetTop只能获取到顶部距它的offsetParent的距离,需此方法获取到元素距顶部的距离
          })
    
          inputs.forEach((item, i)=>{
            item.addEventListener('focus',()=>{
              // 改变top上移页面
              regDom.style.top = '-' + (offsetTopArr[i] - fixHeight) + 'px'
            })
    
            item.addEventListener('blur',()=>{
              // 恢复top
              regDom.style.top = 0
            })
          })
        }
      }

    效果基本实现,这里还有两个问题:

    第一,如果下面的提交按钮是fixed,有些手机键盘弹出时会把按钮顶上来,如果上述代码中fixHeight设置不合适,会导致这个按钮遮挡输入框。所以为了统一效果,将底部按钮取消fixed,随页面滚动。

    第二,如果点击键盘上的收起键盘按钮,会导致页面top无法恢复,因为没有触发输入框失焦方法,需点击空白处恢复。(目前没找到解决办法)

    展开全文
  • 问题如图一个表单:在部分android机型上测试点击靠下的输入框时遇到弹出的软键盘挡住输入框问题,ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第三方输入法的tool bar或者键盘也被当做...

    问题

    如图一个表单:

    ddf1b6789e0d1f9130c8a2dc1b1d38d9.png

    在部分android机型上测试点击靠下的输入框时遇到弹出的软键盘挡住输入框问题,ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第三方输入法的tool bar或者键盘也被当做可视区域,这里不做讨论)

    问题分析及解决办法确立

    最常见的是使用两个方法:scrollIntoViewIfNeeded()、scrollIntoView(),使用方法自行百度。在我这里无效。

    经测试发现android弹出键盘时有两种效果:

    1.将activity挤压,键盘也占一部分activity空间;

    2.键盘弹出在浏览器上面覆盖一层,不影响浏览器大小。

    第二种会出现遮挡问题

    于是想到以下两种方案:

    1.通过动态增加页面高度和设置scrollTop来使输入框到达合适的位置

    2.设置相对定位,通过top来使输入框到达合适的位置

    影响实现的两个点:

    1.js拿不到键盘的弹出和收起事件;

    2.覆盖一层的键盘弹出方式不会触发window.resize事件和onscroll事件。

    解决

    第一种经试验有些问题影响了实现,这里只讨论第二种。

    直接上代码,这里是react项目(css设置absolute配合js改变top实现效果,transition过渡增强用户体验,这里就不放了)

    getElementOffsetTop(el) {

    let top = el.offsetTop

    let cur = el.offsetParent

    while(cur != null){

    top += cur.offsetTop

    cur = cur.offsetParent

    }

    return top

    }

    componentDidMount() {

    const u = navigator.userAgent

    const isAndroid=u.indexOf('Android')>-1||u.indexOf('Linux')>-1;//android终端

    // alert('android'+isAndroid)

    if(isAndroid){ // android统一处理,不影响ios的自身处理

    const body = document.getElementsByTagName('body')[0] // 兼容获取body

    const regDom = document.querySelector('.wrapper_register') // 获取页面根元素

    const content = document.querySelector('.content') // 表单内容部分

    // const scrollHeight = body.scrollHeight // 网页文档高

    // const scrollTop = body.scrollTop// 卷上去的高

    const clientHeight = body.clientHeight //可见高

    const fixHeight = clientHeight/3 // 定位高,弹出键盘时input距浏览器上部的距离,自己定义合适的

    // 符合需弹出键盘的元素query

    const queryStr = 'input[type="text"], input[type="tel"], input[type="password"], textarea'

    const inputs = content.querySelectorAll(queryStr)

    // console.log(inputs)

    const offsetTopArr = Array.prototype.map.call(inputs,item=>{

    return this.getElementOffsetTop(item) // offsetTop只能获取到顶部距它的offsetParent的距离,需此方法获取到元素距顶部的距离

    })

    inputs.forEach((item, i)=>{

    item.addEventListener('focus',()=>{

    // 改变top上移页面

    regDom.style.top = '-' + (offsetTopArr[i] - fixHeight) + 'px'

    })

    item.addEventListener('blur',()=>{

    // 恢复top

    regDom.style.top = 0

    })

    })

    }

    }

    效果基本实现,这里还有两个问题:

    第一,如果下面的提交按钮是fixed,有些手机键盘弹出时会把按钮顶上来,如果上述代码中fixHeight设置不合适,会导致这个按钮遮挡输入框。所以为了统一效果,将底部按钮取消fixed,随页面滚动。

    第二,如果点击键盘上的收起键盘按钮,会导致页面top无法恢复,因为没有触发输入框失焦方法,需点击空白处恢复。(目前没找到解决办法)

    后续

    1.由于android弹出键盘存在一定延迟,所以可以给top更改添加setTimeout,设置合适的延迟时间。

    2.两个h5框架,iScroll、Native.js(虽然在这个问题上没啥用)

    3.最终奥义:修改设计稿,三招 -> 使输入框不在页面的下半部分、采用分页设计、弹出输入层(ps:要和产品和设计沟通,客户不一定会让步 0.0)

    希望大家斧正,交流更好地解决方案,谢谢

    展开全文
  • 键盘挡住输入框终极解决办法
  • 我是用vant的组件van-field <van-field v-model="driveRegisterInfo.driverLicenseName" placeholder="请输入驾驶证姓名" type="text" label="驾驶证姓名" required @focus="focusDriverLicenseName
  • 在Android开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。像微信则直接把登录按钮做在...
  • 键盘挡住输入框,并且页面无法滚动,scrollIntoView无效 ➢ 场景: 安卓部分机型,嵌入在APP WebView的H5页面 ➢ 解决: APP端处理WebView视图 当键盘弹起时,APP把webview的高度挤压,让输入框自动适应可视区 ➢...
  • Android各种键盘挡住输入框解决办法

    千次阅读 2017-05-08 08:00:03
    的投稿,对于键盘挡住输入框,给出了多种方案,希望对大家有所帮助。 潇潇凤儿 的博客地址: http://blog.csdn.net/smileiam 正文 ...
  • 这是效果: 代码: import React, {Component} from 'react'; import { View, Text, Button, StyleSheet, TextInput, ScrollView, KeyboardAvoidingView, Dimensions } from 'react-native'; ...
  • 手机输入时键盘挡住输入框问题 点击input输入框键盘弹起,页面最底部出现在键盘上面 实现: let target=this; setTimeout(()=>{ target.scrollIntoView(true); },100) 当输入完成,input框失去焦点时,页面...
  • 主要介绍了安卓输入框被虚拟键盘挡住的问题(微信开发)的相关资料,需要的朋友可以参考下
  • 弹出软键盘时: ios端$(‘body’).scrollTop()会改变 android端$(window).height()会改变 拉起键盘不是一瞬间,而是有一个缓动过程 问题重现 ios端,经常会出现输入法遮挡输入框的问题(特别是那种有一个白色顶部的...
  • android软键盘挡住输入框问题解决方法
  • Android爬坑之旅:软键盘挡住输入框问题的终极解决方案.docx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,581
精华内容 1,032
关键字:

键盘挡住输入框

友情链接: hb843.zip