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