我实际上正在开发一个具有本机反应的应用程序,并且我正在测试我的plus 6。 SafeAreaView是iPhone X的解决方案,但对于Android,似乎没有解决方案。
有人听说过任何解决此类问题的事情吗?
答案 0 :(得分:13)
最近我不得不使用的一种解决方法:
GlobalStyles.js:
import { StyleSheet, Platform } from 'react-native';
export default StyleSheet.create({
droidSafeArea: {
flex: 1,
backgroundColor: npLBlue,
paddingTop: Platform.OS === 'android' ? 25 : 0
},
});
它的用法如下:
App.js
import GlobalStyles from './GlobalStyles';
import { SafeAreaView } from "react-native";
render() {
return (
<SafeAreaView style={GlobalStyles.droidSafeArea}>
//More controls and such
</SafeAreaView>
);
}
}
您可能需要对其进行一些调整以适合您正在处理的任何屏幕,但这使我的标题位于顶部图标栏的下方。
答案 1 :(得分:4)
做类似
import { StyleSheet, Platform, StatusBar } from "react-native";
export default StyleSheet.create({
AndroidSafeArea: {
flex: 1,
backgroundColor: "white",
paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
}
});
然后在您的App.js中
import SafeViewAndroid from "./components/SafeViewAndroid";
<SafeAreaView style={SafeViewAndroid.AndroidSafeArea}>
<Layout screenProps={{ navigation: this.props.navigation }} /> //OR whatever you want to render
</SafeAreaView>
这应该工作得很好,因为get height将通过计算statusBar的高度来照顾android设备中的纽结,并且会进行相应的安排。
答案 2 :(得分:3)
2020年末答案:对于任何自己遇到此问题的人,他们都对此提供了支持。
关注this文档页面
答案 3 :(得分:3)
如果您在 2020 年看到这一点,并且您还需要 Android 和 iOS 的网络支持,请在您的终端中输入。
expo install react-native-safe-area-context
这将安装更新的安全区域上下文。
然后将以下内容导入您的 app.js
import { SafeAreaView, SafeAreaProvider} from "react-native-safe-area-context";
在 <SafeAreaProvider>
中 main 函数的所有标签前添加 app.js
,最后也要记得关闭它。
最后,添加 view
而不是 SafeAreaView
。
在官方博览会网站上阅读更多信息:SafeAreaContext
答案 4 :(得分:2)
您还可以立即使用这种样式创建帮助器组件
import React from 'react';
import { StyleSheet, Platform, StatusBar, SafeAreaView } from 'react-native';
export default props => (
<SafeAreaView style={styles.AndroidSafeArea} {...props} >
{props.children}
</SafeAreaView>
);
const styles = StyleSheet.create({
AndroidSafeArea: {
paddingTop: Platform.OS === 'android' ? StatusBar.currentHeight : 0
}
});
请注意,我还删除了不必要的样式,这些样式破坏了SafeAreaView的自然行为,在我看来,这种行为破坏了样式。
使用起来就像普通的SafeAreaView一样使用
:import React from 'react';
import SafeAreaView from "src/Components/SafeAreaView";
render() {
return (
<SafeAreaView>
// Rest of your app
</SafeAreaView>
);
}
}
答案 5 :(得分:2)
为了更一致的导入:
import { Platform, StatusBar } from "react-native";
然后像这样使用它:
paddingTop: Platform.OS === 'android' ? StatusBar.currentHeight : 0
答案 6 :(得分:1)
在SafeAreaView
Docs中被告知:
当前仅适用于具有iOS 11或更高版本的iOS设备。
所以现在我肯定在我的项目中使用它,但是我使用Platform
来识别设备平台,对于Android,我为状态栏设置了一个手动安全区域。
答案 7 :(得分:1)
您可以使用react-native-device-info
来获取设备信息,也可以使用带有样式的样式
答案 8 :(得分:1)
您可以使用expo常量来代替使用Platform API。
npm i expo-constants
然后将其导入您的组件中
import Constants from "expo-constants"
然后在样式中可以像这样使用它
const styles = StyleSheet.create({
container: {
paddingTop: Constants.statusBarHeight
} });
要查看Constants控制台日志的所有属性,您会发现一些更有用的东西。
答案 9 :(得分:1)
尽管文档说它仅与iOS相关,但是当我使用React的SafeAreaView时,它在Android的不同屏幕上的表现却有所不同。
我通过实施我的SafeAreaView版本设法解决了该问题:
import React from "react";
import { Platform, View, StatusBar } from "react-native";
import { GeneralStyle } from "../styles";
export function SaferAreaView({ children }) {
if (Platform.OS == "ios") {
return <SaferAreaView style={{ flex: 1 }}>{children}</SaferAreaView>;
}
if (Platform.OS == "android") {
return <View style={{flex: 1, paddingTop: StatusBar.currentHeight}}>{children}</View>;
}
}
这是在旧设备(具有硬件导航)和新陷波设备(具有软件导航)上进行的测试-不同的屏幕尺寸。
答案 10 :(得分:0)
嗯,我遇到了同样的问题。我使用这个lib React Native Status Bar Height解决了这个问题,我建议使用它,因为这是小菜一碟。
而且,如果您使用的是样式组件,则可以像我在下面的示例中所做的那样,在styles.js中添加getStatusBarHeight()
:
import styled from 'styled-components/native';
import { getStatusBarHeight} from 'react-native-status-bar-height';
export const Background = styled.View`
flex:1;
background:#131313;
margin-top: ${getStatusBarHeight()};
`
答案 11 :(得分:0)
Expo 解决方案(docs - 仅限安卓):
import { setStatusBarTranslucent } from 'expo-status-bar';
然后在组件中你可以使用 useEffect
钩子:
useEffect(() => {
setStatusBarTranslucent(false)
},[])
对于 iOS,您可以使用 react-native 中的 <SafeAreaView>
组件。