在本机中隐藏键盘

IT技术 reactjs react-native
2021-04-12 01:52:59

如果我点击文本输入,我希望能够点击其他地方以再次关闭键盘(虽然不是返回键)。在我阅读的所有教程和博客文章中,我没有找到任何与此相关的信息。

这个基本示例仍然不适用于模拟器中的 react-native 0.4.2。还不能在我的 iPhone 上试用。

<View style={styles.container}>
  <Text style={styles.welcome}>
    Welcome to React Native!
  </Text>
  <Text style={styles.instructions}>
    To get started, edit index.ios.js
  </Text>
  <Text style={styles.instructions}>
    Press Cmd+R to reload,{'\n'}
    Cmd+D or shake for dev menu
  </Text>
  <TextInput
    style={{height: 40, borderColor: 'gray', borderWidth: 1}}
    onEndEditing={this.clearFocus}
  />
</View>
6个回答

如果你有keyboardType='numeric'键盘不解除的问题会变得更严重,因为没有办法解除它。

用 ScrollView 替换 View 不是一个正确的解决方案,就好像你有多个textInputs 或buttons,在键盘打开时点击它们只会关闭键盘。

正确的方法是封装View withTouchableWithoutFeedback并调用Keyboard.dismiss()

编辑:您现在可以使用ScrollViewwithkeyboardShouldPersistTaps='handled'仅在孩子未处理点击时关闭键盘(即点击其他文本输入或按钮)

如果你有

<View style={{flex: 1}}>
    <TextInput keyboardType='numeric'/>
</View>

将其更改为

<ScrollView contentContainerStyle={{flexGrow: 1}}
  keyboardShouldPersistTaps='handled'
>
  <TextInput keyboardType='numeric'/>
</ScrollView>

或者

import {Keyboard} from 'react-native'

<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
    <View style={{flex: 1}}>
        <TextInput keyboardType='numeric'/>
    </View>
</TouchableWithoutFeedback>

编辑:您还可以创建一个高阶组件来关闭键盘。

import React from 'react';
import { TouchableWithoutFeedback, Keyboard, View } from 'react-native';

const DismissKeyboardHOC = (Comp) => {
  return ({ children, ...props }) => (
    <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
      <Comp {...props}>
        {children}
      </Comp>
    </TouchableWithoutFeedback>
  );
};
const DismissKeyboardView = DismissKeyboardHOC(View)

像这样简单地使用它

...
render() {
    <DismissKeyboardView>
        <TextInput keyboardType='numeric'/>
    </DismissKeyboardView>
}

注意:accessible={false}需要使输入表单继续可通过 VoiceOver 访问。视障人士会感谢你!

此解决方案有效,但请记住,您不能在 Touchable 组件的子组件中使用滑动手势。
2021-05-22 01:52:59
@PavleLekic 抱歉耽搁了,我更新了答案以及 HOC 方法
2021-06-17 01:52:59
这很好用。我不得不为箭头函数的定义稍微更改语法,以消除 RN 中的意外标记错误: const DismissKeyboardHOC = (Comp) => {
2021-06-17 01:52:59
我无法onPressTouchableWithoutFeedback火灾不管我怎么努力
2021-06-18 01:52:59
太好了,我唯一的评论是您可以使用 RN 中的官方键盘 api,并调用 Keyboard.dismiss() 而不是调用某些 RN 内部实用程序dismissKeyboard()。但目前两者都工作正常。
2021-06-19 01:52:59

这刚刚得到更新和记录没有更多隐藏的技巧。

import { Keyboard } from 'react-native'

// Hide that keyboard!
Keyboard.dismiss()

Github 链接

您可以使用下一个库:KeyboardAwareScrollView
2021-05-25 01:52:59
这不应该被选为最佳答案。问题是在敲击键盘外部时如何关闭键盘。这个答案只是提供了一个 API,而实际的最佳答案提供了一个可行的实现。
2021-05-26 01:52:59
@jehna1 根据问题,这不是正确答案
2021-06-08 01:52:59
Ping @MrMuetze 将此更改为正确答案
2021-06-16 01:52:59
感谢您添加此内容。我希望你的回答能浮出水面。我几乎错过了它并使用了过时的解决方案。
2021-06-20 01:52:59

将此用于自定义解雇

var dismissKeyboard = require('dismissKeyboard');

var TestView = React.createClass({
    render: function(){
        return (
            <TouchableWithoutFeedback 
                onPress={dismissKeyboard}>
                <View />
            </TouchableWithoutFeedback>
        )
    }
})
这与 Keyboard.dismiss 完全等效,因为有记录,所以更可取。github.com/facebook/react-native/blob/...
2021-06-04 01:52:59
有趣的是,对于那些好奇它从何而来的人来说,它是 React Native 中的一个实用程序库。这是来源:github.com/facebook/react-native/blob/master/Libraries/...
2021-06-08 01:52:59
它没有记录,但是 react-native github repo 中的示例确实使用过它几次。
2021-06-17 01:52:59
由于某种原因它不起作用,当我尝试使用 react-native-search-bar
2021-06-18 01:52:59

使用 React Native Keyboard.dismiss()

更新答案

React Native 在 上暴露了静态dismiss()方法Keyboard,所以更新的方法是:

import { Keyboard } from 'react-native'; 

Keyboard.dismiss()

原答案

使用 React Native 的dismissKeyboard库。

我有一个非常相似的问题,我觉得我是唯一一个没有得到它的人。

滚动视图

如果您有 aScrollView或任何从它继承的东西,例如 a ListView,您可以添加一个props,该props将根据按下或拖动事件自动关闭键盘。

props是keyboardDismissMode并且可以具有none,interactive的值on-drag您可以在此处阅读更多相关信息

常规观看次数

如果您有除 a 之外的其他东西,ScrollView并且您希望按下任何按钮来关闭键盘,您可以使用一个简单的TouchableWithoutFeedbackonPress使用 React Native 的实用程序库dismissKeyboard来为您关闭键盘。

在您的示例中,您可以执行以下操作:

var DismissKeyboard = require('dismissKeyboard'); // Require React Native's utility library.

// Wrap your view with a TouchableWithoutFeedback component like so.

<View style={styles.container}>

  <TouchableWithoutFeedback onPress={ () => { DismissKeyboard() } }>

    <View>

      <Text style={styles.welcome}>
        Welcome to React Native!
      </Text>

      <Text style={styles.instructions}>
        To get started, edit index.ios.js
      </Text>

      <Text style={styles.instructions}>
        Press Cmd+R to reload,{'\n'}
        Cmd+D or shake for dev menu
      </Text>

      <TextInput style={{height: 40, borderColor: 'gray', borderWidth: 1}} />

    </View>

  </TouchableWithoutFeedback>

</View>

注意:TouchableWithoutFeedback只能有一个孩子,所以你需要把它下面的所有东西都包装成一个单一的,View如上图所示。

React Native 暴露了dismiss()Keyboard 上的静态方法,所以更新的方法是:import { Keyboard } from 'react-native'; Keyboard.dismiss().
2021-05-31 01:52:59
@pstanton 那么你需要做什么才能关闭键盘?
2021-06-07 01:52:59
找不到办法,只好强行关门!
2021-06-07 01:52:59
如果我想限制键盘(不想关闭)键盘怎么办
2021-06-07 01:52:59
我有一个键盘,因为我在专注于输入字段时重新加载了它。在这种情况下Keyboard.dismiss(),什么都不做,因为它的实现依赖于对输入的关注,而我不再是这样。
2021-06-12 01:52:59

简单的答案是使用 ScrollView 而不是 View 并将 scrollable 属性设置为 false (尽管可能需要调整一些样式)。

这样,当我点击其他地方时,键盘就会消失。这可能是 react-native 的问题,但点击事件似乎只能用 ScrollViews 处理,这会导致所描述的行为。

编辑:感谢 jllodra。请注意,如果您直接点击另一个 Textinput 然后点击外部,键盘仍然不会隐藏。

我现在看到不同的行为。在 TextInput 之外敲击会隐藏键盘,即使我直接敲击另一个 TextInput——这是一个问题,因为你必须在另一个 TextInput 上敲击两次才能输入!叹。(RN 0.19)
2021-05-27 01:52:59
当您点击 TextInput 外部时,键盘会隐藏,但是如果(而不是点击外部)您点击另一个 TextInput,最后点击外部,则键盘不会隐藏。在 0.6.0 上测试。
2021-05-28 01:52:59
您可以将 scrollable 设置为 true 并使用 keyboardShouldPersistTaps={'handled'} 和 keyboardDismissMode={'on-drag'} 来达到相同的效果
2021-05-31 01:52:59
它适用于滚动视图,但仍有一些情况我遇到了我可以单击按钮以使用导航器更改视图的情况,键盘仍然停留在底部,必须手动单击返回键才能关闭它:(
2021-06-03 01:52:59
只有滚动视图对我有用我不知道为什么,当我输入数字键盘时接受的答案会消失
2021-06-17 01:52:59