美文网首页
React Native 多InputText问题

React Native 多InputText问题

作者: gzfgeh | 来源:发表于2017-04-27 11:43 被阅读256次

    出现的问题是:
        在注册的时候有多个信息需要填写,所以就要有多个InputText,这样当键盘弹出的时候就会挡住底下的InputText!!

    **要的结果是:
        0、当键盘没有弹出的时候,页面不满一屏所以不让页面滚动,弹出键盘的时候可以滚动
        1、当点击InputText以外的地方隐藏键盘,并且页面回到初始状态
        2、当点击InputText的时候弹出键盘,切换InputText的时候键盘不消失
        3、当键盘弹出,手指滚动页面的时候,页面可以滚动并且键盘不隐藏
    **

    0、第一个问题解决办法

    在最外层包裹一个ScrollView控件,这样如果ScrollView里面的控件的高度用的百分比就会出问题,要指定具体高度,但是如果写具体数字适配会出问题,所以建议用屏幕高度的百分比,比如HEIGHT/10,用屏幕高度的1/10 作为InputText的高度,这样可以解决页面包裹ScrollView变形的问题。
      但是页面还是不会滚动,因为整个页面的高度不够一屏,所以需要在页面最底层添加一个空白View,高度建议设置成键盘高度或者设置成屏幕高度的一半,这样当键盘弹出的时候页面就可以自由滚动了。

    1、第二个问题解决办法

    给ScrollView添加 onTouchStart这个属性,这个方法就是点击空白处执行的回调,所以这里可以隐藏键盘

    var dismissKeyboard = require('dismissKeyboard');
    
    <ScrollView style={{flex: 1}}
      keyboardShouldPersistTaps='always'
      ref = {(ref)=>this.scrollView = ref}
      onTouchStart= {()=> {this._onTouchStart()}}
      onScroll = {()=> {this._onScroll()}}>
    
    _onTouchStart(){
      dismissKeyboard();
      this.scrollView.scrollTo({x:0,y:0,animated:true})
    }
    

    这样就可以隐藏键盘了。
      但是这样当切换InputText的时候也会隐藏键盘然后弹出,这样体验非常不好,这样就是第三个问题了。

    2、第三个问题解决办法

    需要回调InputText的焦点,所以需要得到InputText的获取焦点和失去焦点回调,

    <TextInput style={styles.input}
                                 placeholder='请输入手机号'
                                 numberOfLines={1}
                                 underlineColorAndroid={'transparent'}
                                 keyboardType={'numeric'}
                                 maxLength={11}
                                 onFocus={()=> {this._onFocus()}}
                                 onBlur={()=> {this._onBlur()}}/>
    

    其中onFocus是得到焦点的回调,OnBlur是失去焦点的回调

    3、第四个问题解决办法

    这个要和上面问题一起解决,因为要监听滚动回调,所以需要给ScrollView添加onScroll这个回调,因为滚动也会影响键盘,所以要在这几个回调的方法里面,在适当时机隐藏和打开键盘

    /**
         * input 获取焦点
         * @private
         */
        _onFocus(){
            isHide = true;
        }
    
        /**
         * input 失去焦点
         * @private
         */
        _onBlur(){
            isHide = false;
        }
    
        /**
         * 点击空白处  相应的函数
         * @private
         */
        _onTouchStart(){
            setTimeout(()=> {
                if (!isHide){
                    dismissKeyboard();
                    this.scrollView.scrollTo({x:0,y:0,animated:true})
                };
                isHide = false;
            }, 500);
        }
    
        _onScroll(){
            isHide = true;
        }
    
    

    总结:以上是在加注册功能时候遇到的问题,目前只是适配Android机型,后续更新本篇文章来适配IOS

    相关文章

      网友评论

          本文标题:React Native 多InputText问题

          本文链接:https://www.haomeiwen.com/subject/cmugzttx.html