可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
KeyboardAvoidingView not Working Properly
I am trying to use the KeyboardAvoidingView with behavior="padding"
.
For some reason, when I'm trying to enter any text in TextInput
, there's a space below the TextInput. Attached is a picture of what is happening as well as the code. Any chance anyone has any idea whats happening here?
render() {
return (
<KeyboardAvoidingView style={{ flex: 1}} behavior="padding">
< View
style={{
flex: 1,
backgroundColor: "#FFFFFF",
}}
>
<ScrollView
contentContainerStyle={{ justifyContent: "flex-end", flex: 1 }}>
<ChatInfo />
</ScrollView>
<View style={styles.container}>
<TextInput
style={styles.input}
underlineColorAndroid="transparent"
autoCapitalize="none"
onChangeText={text => this.setState({ text: text })}
value={this.state.text}
/>
<TouchableOpacity
style={styles.submitButton}
onPress={this.submitName}
>
<Text style={styles.submitButtonText}> SEND </Text>
</TouchableOpacity>
</View>
</ View>
</KeyboardAvoidingView>
);
}
}
export default connect()(ChatScreen);
const styles = StyleSheet.create({
input: {
margin: 2,
paddingLeft: 15,
flex: 1,
height: 40,
padding: 10,
fontSize: 14,
fontWeight: "400"
},
container: {
borderTopWidth: 1,
minWidth: "100%",
borderColor: "#cccccc",
height: 44,
flexDirection: "row",
justifyContent: "space-between",
backgroundColor: "#fff"
},
submitButtonText: {
color: "#0a9ffc",
fontSize: 14,
fontWeight: "500"
},
submitButton: {
backgroundColor: "#fff",
padding: 10,
margin: 2,
height: 40,
alignItems: "center",
justifyContent: "center"
}
});
回答1:
If you are using react-navigation, this is affected by the header of the react-navigation. The height of the header is vary on different mobile screen. So you have to get the height of the header and pass into the keyboardVerticalOffset props.
import { Header } from 'react-navigation-stack';
<KeyboardAvoidingView
keyboardVerticalOffset = {Header.HEIGHT + 20} // adjust the value here if you need more padding
style = {{ flex: 1 }}
behavior = "padding" >
<ScrollView>
<TextInput/>
<TextInput/>
<TextInput/>
<TextInput/>
<TextInput/>
<TextInput/>
</ScrollView>
</KeyboardAvoidingView>
回答2:
This is a known issue with KeyboardAvoidingView and Android. There are multiple ways to address this issue.
React Native documentation says:
Android may behave better when given no behavior prop at all, whereas iOS is the opposite.
So, if you are working only with Android you may remove behavior prop and it should work straight away. For best results add android:windowSoftInputMode="adjustResize"
to your Manifest.
Alternatively you can give an offset value that works for you something like this:
KeyboardAvoidingView keyboardVerticalOffset={-500} behavior="padding"
For ios do the same thing conditionally:
behavior= {(Platform.OS === 'ios')? "padding" : null}
keyboardVerticalOffset={Platform.select({ios: 0, android: 500})}
回答3:
WARNING
This appears to be only a partial solution, although it works initially, if the android phone is locked on the screen with the keyboard avoiding layout, when you unlock you end up with the extra padding above the keyboard again.
tl;dr
Remove android:windowSoftInputMode="adjustResize"
from the AndroidManifest.xml
Before
...
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"
>
...
After
...
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
>
...
Why
If I understand the issue correctly, I have been dealing with the same thing. By having android:windowSoftInputMode="adjustResize"
in the manifest, the android system will try to do the same job as the KeyboardAvoidingView
. This results in extra spacing being added above the keyboard on Android only.
If working on both platforms you are going to have to deal with this on iOS every time you are working with keyboard input, so best to remove the android specific behaviour by android:windowSoftInputMode="adjustResize"
from the manifest and using the KeyboardAvoidingView
every time.
回答4:
The KeyboardAvoidingView
must be a ScrollView
child, not the other way around. This way it behaves normal(normal for what purpose I am using it). Try it and let me know how it went.
<ScrollView>
<KeyboardAvoidingView styles={styles.container} behavior='padding'>
</KeyboardAvoidingView>
</ScrollView>
回答5:
I think this is because the behavior props value, so I think adding this line in the keyboardavoidview will help
<KeyboardAvoidingView
style = {{ flex: 1 }}
behavior={Platform.OS === "ios" ? "padding" : null}>
</KeyboardAvoidingView>
回答6:
<KeyboardAvoidingView styles={styles.container} behavior = 'padding' enabled>
<ScrollView>
<View>
....
</View>
</ScrollView>
</KeyboardAvoidingView>
回答7:
<KeyboardAvoidingView style={styles.keyboardcontainer} behavior="padding"
keyboardVerticalOffset={Platform.select({ios :120, android : 500})}
enabled>
<View style={{flex: 1 }}>
// Your Code
</View>
</KeyboardAvoidingView>