【问题标题】:How to get 'Keyboard height before it opens' in React Native?如何在 React Native 中获取“打开前的键盘高度”?
【发布时间】:2019-08-11 06:42:16
【问题描述】:

环境:

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;

【问题讨论】:

  • 尝试在构造函数中添加一个立管。
  • 我不明白你的意思

标签: react-native react-hooks


【解决方案1】:

我不知道一个非常干净的方法来做到这一点,但你可以显示键盘,获取高度,然后用你的视图替换键盘。

【讨论】:

  • 是的,我同意你的观点,这不是很干净的方法。您没有意识到聊天应用中的表情符号选择器吗?
  • 是的,但主要用例是首先使用键盘,然后在键入过程中的某个时间点拉出表情符号或图像选择器。在输入任何内容之前拉出表情符号或图像选择器的情况非常有优势。我们有一个基于用户是在 iOS 还是 Android 上的 emoji 容器高度的默认值,并且该默认值有时与实际键盘高度相差几个像素。一旦激活键盘,它就会被覆盖。在普通键盘之前拉出表情符号键盘是不太可能的边缘情况。
  • 您甚至可以在键盘至少激活一次之前隐藏表情符号图标。我还假设您的用户首先需要注册或以其他方式输入用户名才能进入应用程序,在此期间您可以将键盘高度保存到存储空间。
  • 在用户登录或注册时,最好将键盘高度保存到存储中。当文本输入具有属性 disableFullscreenUI 时,横向模式如何?有什么想法吗?
  • 我们禁用了聊天应用的横向功能,无法根据经验说话。但似乎您可以保存两个值,一个用于常规模式,一个用于横向模式。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2014-05-26
  • 2018-11-29
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
相关资源
最近更新 更多