反应本机 textinput 多行没有被键盘推高
React native textinput multiline is not being pushed up by keyboard
我有一个 TextInput,multiLine 为 true。然而,在两行之后文本消失在键盘后面。我试过将 TextInput 包装在 KeyboardAvoidingView 中,但它不起作用。
当我取消对 TextInput 的关注然后单击底线时,键盘确实会推高 TextInput。知道如何让 TextInput 的最后一行保留在键盘顶部吗?
代码:
<View style={styles.descriptionFlexStyle}>
<Text
style={[
styles.headerTextStyle,
{ marginTop: Window.height * 0.04 }
]}> Please fill in a reason </Text>
<ScrollView>
<TextInput
style={styles.reasonTextInput}
placeholder="Reason"
value={reasonText}
multiline={true}
onChangeText={input =>
this.setState({
reasonText: input
})
}
underlineColorAndroid="transparent"
ref="reasonTextInput"
/>
</ScrollView>
</View>
你好,亲爱的,你必须使用来自 React-Native 的 KeyboardAvoidingView
组件,并在其上设置如下所示的行为:
<KeyboardAvoidingView behavior={'postion' || 'height' || 'padding'}>
<View style={styles.descriptionFlexStyle}>
<Text
style={[
styles.headerTextStyle,
{ marginTop: Window.height * 0.04 }
]}> Please fill in a reason </Text>
<ScrollView>
<TextInput
style={styles.reasonTextInput}
placeholder="Reason"
value={reasonText}
multiline={true}
onChangeText={input =>
this.setState({
reasonText: input
})
}
underlineColorAndroid="transparent"
ref="reasonTextInput"
/>
</ScrollView>
</View>
</KeyboardAvoidingView>
好的,我终于用 "KeyboardAvoidingView" 解决了这个问题。我做了两件事。首先,我删除了 TextInput 上的高度,然后将 "KeyboardAvoidingView" 上的行为属性设置为 "padding"。现在对我来说很完美。让我知道这是否有帮助! :)
这个回答可能有点晚了。但是,我找到了一个不使用 KeyboardAvoidingView
组件的解决方法。可以使用 ScrollView
将多行 TextInput
滚动到顶部以获得 'keyboard avoiding' 效果。在使用 scrollTo()
方法将 TextInput
直接滚动到屏幕顶部之前,我会使用 ref measure()
方法获取 TextInput
的顶部 y 值,有效避开键盘
import React, { useRef } from "react";
import { ScrollView, TextInput, View } from "react-native";
export default function Test() {
const scrollViewRef = useRef(null);
const viewRef = useRef(null);
const handleFocus = () => {
viewRef.current.measure((x, y) => {
scrollViewRef.current.scrollTo({ x: 0, y });
});
};
return (
<ScrollView ref={scrollViewRef}>
{/* View to fill up space */}
<View
style={{
width: "80%",
height: 600,
}}
/>
<View ref={viewRef}>
<TextInput
onFocus={handleFocus}
multiline={true}
style={{
width: "80%",
height: 100,
backgroundColor: "whitesmoke",
alignSelf: "center",
}}
/>
{/* View to fill up space */}
<View
style={{
width: "80%",
height: 600,
}}
/>
</View>
</ScrollView>
);
}
我有一个 TextInput,multiLine 为 true。然而,在两行之后文本消失在键盘后面。我试过将 TextInput 包装在 KeyboardAvoidingView 中,但它不起作用。
当我取消对 TextInput 的关注然后单击底线时,键盘确实会推高 TextInput。知道如何让 TextInput 的最后一行保留在键盘顶部吗?
代码:
<View style={styles.descriptionFlexStyle}>
<Text
style={[
styles.headerTextStyle,
{ marginTop: Window.height * 0.04 }
]}> Please fill in a reason </Text>
<ScrollView>
<TextInput
style={styles.reasonTextInput}
placeholder="Reason"
value={reasonText}
multiline={true}
onChangeText={input =>
this.setState({
reasonText: input
})
}
underlineColorAndroid="transparent"
ref="reasonTextInput"
/>
</ScrollView>
</View>
你好,亲爱的,你必须使用来自 React-Native 的 KeyboardAvoidingView
组件,并在其上设置如下所示的行为:
<KeyboardAvoidingView behavior={'postion' || 'height' || 'padding'}>
<View style={styles.descriptionFlexStyle}>
<Text
style={[
styles.headerTextStyle,
{ marginTop: Window.height * 0.04 }
]}> Please fill in a reason </Text>
<ScrollView>
<TextInput
style={styles.reasonTextInput}
placeholder="Reason"
value={reasonText}
multiline={true}
onChangeText={input =>
this.setState({
reasonText: input
})
}
underlineColorAndroid="transparent"
ref="reasonTextInput"
/>
</ScrollView>
</View>
</KeyboardAvoidingView>
好的,我终于用 "KeyboardAvoidingView" 解决了这个问题。我做了两件事。首先,我删除了 TextInput 上的高度,然后将 "KeyboardAvoidingView" 上的行为属性设置为 "padding"。现在对我来说很完美。让我知道这是否有帮助! :)
这个回答可能有点晚了。但是,我找到了一个不使用 KeyboardAvoidingView
组件的解决方法。可以使用 ScrollView
将多行 TextInput
滚动到顶部以获得 'keyboard avoiding' 效果。在使用 scrollTo()
方法将 TextInput
直接滚动到屏幕顶部之前,我会使用 ref measure()
方法获取 TextInput
的顶部 y 值,有效避开键盘
import React, { useRef } from "react";
import { ScrollView, TextInput, View } from "react-native";
export default function Test() {
const scrollViewRef = useRef(null);
const viewRef = useRef(null);
const handleFocus = () => {
viewRef.current.measure((x, y) => {
scrollViewRef.current.scrollTo({ x: 0, y });
});
};
return (
<ScrollView ref={scrollViewRef}>
{/* View to fill up space */}
<View
style={{
width: "80%",
height: 600,
}}
/>
<View ref={viewRef}>
<TextInput
onFocus={handleFocus}
multiline={true}
style={{
width: "80%",
height: 100,
backgroundColor: "whitesmoke",
alignSelf: "center",
}}
/>
{/* View to fill up space */}
<View
style={{
width: "80%",
height: 600,
}}
/>
</View>
</ScrollView>
);
}