3.4.3 适配 Android 机型

虽然当前的代码在 iPhone6 机型上运行结果没问题,但是在其它机型上是有问题的。

图3-7 Android运行结果图3-7 Android运行结果

Android 运行结果如图3-7 所示,问题还是蛮严重的。选项卡上面多了一块空白的距离,并且还存在本不应该有的阴影。

多的空白距离是由于在 tabBarOptions 中的 style 的定义了 paddingTop: 20。 因为 iOS 和 Android 存在差异, Android 代码可以控制的页面一般是不包含状态栏的,也就是说每个页面最顶端是在状态栏之下,而 iOS 是包含状态栏的,状态栏的高度是 20 个单位。所以在 iOS 程序中为了保证状态栏正常显示,需要在顶部组件增加 20 的 padding,Android 程序并不需要。

Android 选项卡采用质感设计,默认是有阴影的,通过配置样式是可以去掉的。

修改 ‘/src/config/theme.js ’

import {Dimensions, Platform} from 'react-native';
export default module = {
    screenWidth: Dimensions.get('window').width,
    screenHeight: Dimensions.get('window').height,
    btnActiveOpacity: 0.5,
    actionBar: {
        height: 44,//Platform.OS === 'android' ? 56 : 44 //根据不通平台高度不一致
        backgroundColor:'#fff'  //统一定义组件的背景色
    },
    barContentPad: (Platform.OS === 'android' ? 0 : 20), //根据不同平台顶部 padding不一致
    // 常用颜色
    pageBackgroundColor: '#f5f5f5',
    primaryColor: '#22548a',
    lightGray: '#f5f5f5',
    lightBlack: '#999999',
};

在主题样式文件中定义了 actionBar.height , Android 为 56 单位,iOS为44,顶部组件的高度参考Android/iOS 原生顶部组件的高度。当然也可以根据设计稿尺寸让 Android 和 iOS 都保持44,barContentPad 用于顶部的 padding ,Android 为0。

修改 App.js,应用 theme.js 中定义的样式,Android 程序顶部 padding 为 0 ,代码如下:

const CategoryTab = createMaterialTopTabNavigator({
  //...
}, {
    //...
    tabBarOptions: {
        // tabbar上label的style
        labelStyle: {
        },
        // tabbar的style
        style: {
            height: theme.actionBar.height+theme.barContentPad,//修改高度
            marginHorizontal: theme.screenWidth / 6,
            paddingTop: theme.barContentPad, //不同平台高度不一样
            backgroundColor: '#fff',
            elevation: 0, //组件的高度为0 就没有阴影了
            shadowOpacity: 0 //阴影完全透明
        },
        //...
    },
    //自定义 TabBar
    tabBarComponent: (props) => (
        <CustomTabBar {...props}/>
    )
});

Android 状态栏的背景色也是可以修改成白色的,如果修改 Android 端状态栏背景色,可以通过 StatusBar 组件修改,参考文档:http://facebook.github.io/react-native/docs/statusbar.html 修改 src/pages/CategoryPage.js ,其它页面也一并修改。

type Props = {};
export default class CategoryPage extends Component<Props> {

    render() {
        return ( // 渲染布局
            <View style={styles.container}>
                <StatusBar barStyle={'dark-content'} backgroundColor={'#fff'}/>
                <Text style={{margin:10,fontSize:20,color:'black'}}>分类</Text>
            </View>
        );
    }
}

render 函数中添加了 StatusBar 组件。 barStyle 表示状态栏的文字颜色,dark-content 表示灰色,light-content 表示白色。 backgroundColor 表示状态栏背景色,只在 Android4.4 以上版本中有效。 不同页面状态栏颜色不一致的话,可以通过监听页面获取焦点事件动态设置 StatusBar 颜色,代码如下:

type Props = {};
export default class CategoryPage extends Component<Props> {

    componentDidMount() {
        // 监听页面获取焦点
        this._navListener = this.props.navigation.addListener('didFocus', () => {
            StatusBar.setBarStyle('dark-content');
            Platform.OS==='android' && StatusBar.setBackgroundColor('#fff');
        });
    }
    componentWillUnmount() {
        this._navListener.remove();
    }
    //...
}

Android 代码执行结果如图3-8所示。 图3-8 Android 代码执行结果 图3-8 Android 代码执行结果

查看代码

如果你已经从 GitHub 上克隆了这个程序的 Git 仓库,那么可以执行 git checkout 3d 签出程序的这个版本。

results matching ""

    No results matching ""