17-React Native, Android端需要注意的特别

作者: Valley4Z | 来源:发表于2018-06-09 14:00 被阅读37次

    01 - 设置投影

    给组件view设置投影时,需要特别设置的参数:

    elevation: 5,

    02 - 垂直滚动

    在 swiper 组件中,Android 不支持垂直方向的上下滚动,只能水平方向左右滚动,可以单独设置组件旋转一定角度,从而实现垂直滚动

    03 - scrollview 相关

    Android平台,scrollview 不支持包含多个子view,只能包含一个子view,否则可能导致子view显示不全

    scrollview 中包含 flatlist 布局时,会导致滑动冲突,flatlist手势触摸滑动无响应,scrollview拦截了触摸事件

    解决方式:
    onTouchStartonScrollEndDrag方法中,设置scrollview是否响应,调用方法:

    onScrollEndDrag={()=>{this.props.callback(true);}}
    
    onTouchStart(event) {
        this.props.callback(false);
        return true;
    }
    

    在整个手势触摸滑动过程中,Android平台监听不到onTouchEnd事件

    04 - RefreshControl 组件

    Android平台,下拉刷新组件样式是实心的圆圈,且整个界面不会随着下拉动作滑动,只有 activity 响应下拉动作

    目前,下拉刷新组件支持自定义样式的资源不是很多,也不能保证两个平台都支持

    05 - keyboard键盘监听事件

    文本输入框中,调起或收缩键盘时,Android平台不能监听到keyboardWillShowkeyboardWillHide 事件,只能监听到keyboardDidShowkeyboardDidHide事件,所以监听键盘时处理的动作,会响应的相对慢一点

    06 - 键盘遮挡输入框的问题

    FaceBook官方提供的解决方案是 KeyboardAvoidingView 这个组件使用上有些问题,暂时不推荐使用这个组件解决键盘遮挡的问题。关于KeyboardAvoidingView的使用相关

    比较有效,而且两个平台都兼容的方式,还是计算组件坐标,再刷新组件的样式这种方法。具体使用方法可以参照我写的另一篇08-关于refs,提取自定义控件的坐标

    07 - 设置分割线的高度

    当分割线的高度设置在0 ~ 1之间时,受屏幕分辨率的影响,分割线显示的高度会分布不均匀,需要单独判断屏幕分辨率做计算

    /**
         * 线的宽带
         *
         * @static
         * @memberof AppUtils
         */
        static getLineWidthOrHeight() {
            // 返回设备的像素密度,例如:
            // PixelRatio.get() === 1      mdpi Android 设备 (160 dpi)
            // PixelRatio.get() === 1.5   hdpi Android 设备 (240 dpi)
            // PixelRatio.get() === 2     iPhone 4, 4S    iPhone 5, 5c, 5s     iPhone 6      xhdpi Android 设备 (320 dpi)
            // PixelRatio.get() === 3     iPhone 6 plus   xxhdpi Android 设备 (480 dpi)
            // PixelRatio.get() === 3.5   Nexus 6
    
            let lineWidthOrHeight = 0;
            if (PixelRatio.get() < 2) {
                // 1 1.5
                lineWidthOrHeight = 1;
            } else if (PixelRatio.get() < 3) {
                // 2
                lineWidthOrHeight = 0.5;
            } else {
                // 3  3.5
                if (this.isAndroidPlatform()) {
                    lineWidthOrHeight = 0.5;
                } else {
                    lineWidthOrHeight = 0.333333333;
                }
            }
            return lineWidthOrHeight;
        }
    

    08 - 针对 react-native: 0.55.4版, 使用 setState或给 state赋值的问题

    • 问题主要出现在涉及文本输入框组件中。
      比如,在输入文本时,实时监听文本内态,并将文本内容做一些赋值处理
    onChangeText = text => {
        this.state.companyName = text; //iOS端会出现无法输入汉字的现象,Andriod端正常
        //this.companyName = text;//iOS端正常,Andriod端正常
        this.changeBtnColor(text); //这里会去调setState
    };
    
    • 另外,设置 TextInputdefaultValuevalue 页会有点小问题
    • defaultValue,即默认值,应该是给 TextInput 初始化赋值的时候使用
    • value,非初始化值,常用在 ref 相关获取组件里的内容时使用
    • valueTextInput 中使用时,最好不要实时去调用 setState ,否则会出现无法输入内容的问题
    <TextInput                                        
        maxLength={50}               
        autoFocus={true}
        textAlign="center"
        onChangeText={this.onChangeText.bind(this)}
        defaultValue={this.state.companyName} //最好不要用 value 属性
    />
    

    贴上本人翻译的一本后现代小说地址,亚马逊已上架,欢迎阅读,吐槽~哈

    相关文章

      网友评论

        本文标题:17-React Native, Android端需要注意的特别

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