react-native - 如何在 React Native 中获取“打开前的键盘高度”?
问题描述
环境:
反应原生 0.60.4
问题:
我正在开发聊天应用程序。聊天有表情符号选择器。表情符号选择器必须与键盘具有相同的高度。我需要在它打开之前获得键盘的高度。我尝试使用键盘监听器,但它们在打开后会给出高度。我的最终目标是按照图片中的方式进行操作。你是怎样做的?
例子:
import React, { useState, useEffect, createRef } from "react";
import {
Keyboard,
TextInput,
View,
EmitterSubscription,
Button,
KeyboardAvoidingView,
StyleSheet
} from "react-native";
const APPROXIMATE_HEIGHT = 360;
const App = () => {
let inputRef = createRef<TextInput>();
const [visible, setVisible] = useState(false);
const [height, setHeight] = useState(APPROXIMATE_HEIGHT);
useEffect(() => {
let keyboardDidShowListener: EmitterSubscription;
keyboardDidShowListener = Keyboard.addListener(
"keyboardDidShow",
keyboardDidShow
);
return () => {
if (keyboardDidShowListener) {
keyboardDidShowListener.remove();
}
};
});
const keyboardDidShow = (e: any) => {
setVisible(false);
setHeight(e.endCoordinates.height); // sets the height after opening the keyboard
};
const openEmojiPicker = () => {
Keyboard.dismiss();
setVisible(true);
};
const openKeyboard = () => {
setVisible(false);
inputRef.current!.focus();
};
return (
<KeyboardAvoidingView style={styles.container} behavior="height" enabled>
<View style={styles.inputToolBar}>
<Button
title={visible ? "Open keyboard" : "Open emoji picker"}
onPress={visible ? openKeyboard : openEmojiPicker}
/>
<TextInput placeholder="test" ref={inputRef} />
</View>
<View style={[styles.emojiPicker, { height: visible ? height : 0 }]} />
</KeyboardAvoidingView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
position: "absolute",
bottom: 0,
left: 0,
right: 0
},
inputToolBar: {
flexDirection: "row"
},
emojiPicker: {
backgroundColor: "red"
}
});
export default App;
解决方案
我不知道这样做的非常干净的方法,但是您可以显示键盘,获取高度,然后用您的视图替换键盘。
推荐阅读
- json - 10 次中有 1 次出现错误 json.decoder.JSONDecodeError: Expecting ','
- python - 列表中的 XGBoost 功能重要性
- angular - 如何将角度单元测试写入组件外部的函数
- python - 如何在 VSCode 中获取一般 pyd 文件和 confluent_kafka 的参数提示?
- node.js - Flutter + FCM:java.lang.IllegalArgumentException:不支持的值:Bundle[mParcelledData.dataSize=100]
- c# - 为什么我可以从计算机堆栈c#的末尾访问数据
- python - 为什么这个 django url 不在 Mac 上运行?
- r - 使用 openxlsx 包的工作表链接问题
- node.js - 无法从猫鼬模型中获得文档“查找”承诺
- web - 如何使用思维导图导航创建网站