ซ่อนแป้นพิมพ์ในภาษาที่ตอบสนอง


448

หากฉันแตะลงใน textinput ฉันต้องการที่จะสามารถแตะที่อื่นเพื่อยกเลิกแป้นพิมพ์อีกครั้ง (ไม่ใช่ปุ่มย้อนกลับแม้ว่า) ฉันไม่พบข้อมูลเกี่ยวกับสิ่งนี้ในบทแนะนำและบล็อกโพสต์ที่ฉันอ่าน

ตัวอย่างพื้นฐานนี้ยังใช้งานไม่ได้สำหรับฉันที่มีปฏิกิริยาตอบสนองพื้นเมือง 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>


คำตอบที่ถูกต้องควรมาจาก Eric Kim ด้านล่าง คำตอบ ScrollView (ตั้งค่าการเลื่อนเป็นเท็จ) ไม่เหมาะถ้าคุณมีการป้อนข้อความหลายรายการมันไม่อนุญาตให้คุณกระโดดจากการป้อนข้อความไปยังการป้อนข้อความโดยไม่ต้องปิดคีย์บอร์ด
hippofluff

2
สำหรับผู้ที่ต้องการโซลูชันสำหรับแอปทั้งหมดดูคำตอบของ @ Scottmas ด้านล่าง (ลิงก์: stackoverflow.com/a/49825223/1138273 )
Hamed

คำตอบ:


563

ปัญหาเกี่ยวกับคีย์บอร์ดที่ไม่ได้ยกออกจะรุนแรงขึ้นหากคุณมีkeyboardType='numeric'เนื่องจากไม่มีวิธีที่จะยกเลิก

การแทนที่มุมมองด้วย ScrollView ไม่ใช่วิธีแก้ไขที่ถูกต้องราวกับว่าคุณมีหลายtextInputs หรือbuttons แตะที่พวกเขาในขณะที่แป้นพิมพ์ขึ้นจะยกเลิกคีย์บอร์ดเท่านั้น

วิธีที่ถูกต้องคือการห่อหุ้มมุมมองด้วยTouchableWithoutFeedbackและการโทรKeyboard.dismiss()

แก้ไข: ตอนนี้คุณสามารถใช้ScrollViewกับkeyboardShouldPersistTaps='handled'เพียงยกเลิกแป้นพิมพ์เมื่อแตะที่ไม่ได้รับการจัดการโดยเด็ก ๆ (เช่นการแตะที่ textInputs อื่น ๆ หรือปุ่ม.)

ถ้าคุณมี

<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 คนที่มีความบกพร่องทางสายตาจะขอบคุณ!


28
นี่เป็นสิ่งที่ดีความคิดเห็นเดียวที่ฉันมีคือคุณสามารถใช้ Keyboard api อย่างเป็นทางการใน RN และเรียกว่า Keyboard.dismiss () แทนที่จะเรียกใช้ยูทิลิตี้ภายใน RN บางตัว dismissKeyboard () แต่ทั้งคู่ทำงานได้ดีในปัจจุบัน
Pavle Lekic

@PavleLekic ขออภัยในความล่าช้าฉันได้อัปเดตคำตอบพร้อมกับวิธีการ HOC
Eric Kim

3
มันใช้งานได้ดี ฉันต้องเปลี่ยนไวยากรณ์เล็กน้อยสำหรับนิยามของฟังก์ชั่นลูกศรเพื่อลบข้อผิดพลาดโทเค็นที่ไม่คาดคิดใน RN: const DismissKeyboardHOC = (Comp) => {
jwinn

2
ฉันไม่สามารถรับonPressสำหรับTouchableWithoutFeedbackไฟไม่ว่าสิ่งที่ฉันพยายาม
แบรดไรอัน

1
ทำไมต้องสร้าง HoC และเพิ่มสิ่งนี้ลงในรูทของแอพของคุณ /
Dimitri Kopriwa

248

สิ่งนี้เพิ่งได้รับการอัพเดตและบันทึกไว้ ! ไม่มีลูกเล่นซ่อนเร้นอีกต่อไป

import { Keyboard } from 'react-native'

// Hide that keyboard!
Keyboard.dismiss()

https://github.com/facebook/react-native/pull/9925


4
ขอบคุณที่เพิ่มสิ่งนี้ ฉันหวังว่าคำตอบของคุณจะลอยขึ้นไปด้านบน ฉันเกือบพลาดและใช้โซลูชันที่ล้าสมัย
สุนัขชีพด็อก

2
Pinging @MrMuetze เพื่อเปลี่ยนสิ่งนี้เป็นคำตอบที่ถูกต้อง
jehna1

8
นี่ไม่ควรถูกเลือกเป็นคำตอบที่ดีที่สุด คำถามถามว่าจะยกเลิกคีย์บอร์ดได้อย่างไรเมื่อแตะที่ด้านนอก คำตอบนี้มีเพียง API สำหรับการทำเช่นนั้นในขณะที่คำตอบที่ดีที่สุดให้การใช้งานได้
jskidd3

คุณสามารถใช้ไลบรารีถัดไป: KeyboardAwareScrollView
Alejandro Gonzalez

97

ใช้สิ่งนี้สำหรับการเลิกจ้างที่กำหนดเอง

var dismissKeyboard = require('dismissKeyboard');

var TestView = React.createClass({
    render: function(){
        return (
            <TouchableWithoutFeedback 
                onPress={dismissKeyboard}>
                <View />
            </TouchableWithoutFeedback>
        )
    }
})

มันไม่ได้ทำเป็นเอกสาร แต่ตัวอย่างใน repo GitHub แบบตอบโต้พื้นเมืองใช้งานไม่กี่ครั้ง
syarul

7
สิ่งที่น่าสนใจสำหรับผู้ที่อยากรู้ว่ามันมาจากไหนมันเป็น Library Utility ใน React Native นี่คือแหล่งที่มา: github.com/facebook/react-native/blob/master/Library/…
Joshua Pinter

1
ด้วยเหตุผลบางอย่างมันไม่ทำงานเมื่อฉันลองreact-native-search-bar
Peter G.

นี่เป็นสิ่งที่เทียบเท่ากับ Keyboard.dismiss ซึ่งเป็นที่นิยมมากกว่าเนื่องจากมีการบันทึกไว้ github.com/facebook/react-native/blob/…
Ricardo Stuven

88

ใช้ React Native's Keyboard.dismiss()

อัปเดตคำตอบ

React Native เปิดเผยdismiss()วิธีการแบบคงที่บนKeyboardดังนั้นวิธีการที่อัปเดตคือ:

import { Keyboard } from 'react-native'; 

Keyboard.dismiss()

คำตอบเดิม

ใช้ React Native's dismissKeyboardไลบรารี

ฉันมีปัญหาที่คล้ายกันมากและรู้สึกว่าฉันเป็นคนเดียวที่ไม่ได้รับ

ScrollViews

หากคุณมีScrollViewหรือสิ่งใดก็ตามที่สืบทอดมาจากมันเช่นListViewคุณสามารถเพิ่มเสาที่จะยกเลิกแป้นพิมพ์โดยอัตโนมัติตามการกดหรือการลากเหตุการณ์

เสาเป็นkeyboardDismissModeและสามารถมีค่าของnone, หรือinteractive on-dragคุณสามารถอ่านเพิ่มเติมเกี่ยวกับที่นี่

มุมมองปกติ

หากคุณมีสิ่งอื่นนอกเหนือจาก a ScrollViewและคุณต้องการให้สื่อใด ๆ ยกเลิกการใช้งานแป้นพิมพ์คุณสามารถใช้งานง่าย ๆTouchableWithoutFeedbackและonPressใช้ไลบรารี่ของ 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ตามที่แสดงด้านบน


4
React Native เปิดเผยdismiss()วิธีการคงที่บนคีย์บอร์ดดังนั้นวิธีการที่ได้รับการปรับปรุงคือ: import { Keyboard } from 'react-native'; Keyboard.dismiss().
Joshua Pinter

1
ฉันมีแป้นพิมพ์ที่ห้อยไปมาตั้งแต่ฉันรีโหลดในขณะที่มุ่งเน้นไปที่ช่องใส่ ในกรณีนี้Keyboard.dismiss()ไม่ทำอะไรเลยเนื่องจากการนำไปปฏิบัตินั้นขึ้นอยู่กับการมุ่งความสนใจไปที่อินพุตซึ่งฉันไม่ได้เป็นอยู่อีกต่อไป
pstanton

@pstanton คุณต้องทำอย่างไรเพื่อยกเลิกคีย์บอร์ด
Joshua Pinter

ไม่มีทางที่ฉันจะหาดังนั้นฉันจึงบังคับให้ปิด!
pstanton

41

คำตอบง่ายๆคือใช้ ScrollView แทน View และตั้งค่าคุณสมบัติ scrollable เป็น false (อาจต้องปรับแต่งสไตล์บางอย่าง)

ด้วยวิธีนี้แป้นพิมพ์จะถูกยกเลิกเมื่อฉันแตะที่อื่น นี่อาจเป็นปัญหาเกี่ยวกับการตอบสนองดั้งเดิม แต่ดูเหมือนว่าเหตุการณ์การแตะจะจัดการกับ ScrollViews เท่านั้นซึ่งนำไปสู่พฤติกรรมที่อธิบายไว้

แก้ไข: ขอบคุณ jllodra โปรดทราบว่าหากคุณแตะที่ Textinput อื่นโดยตรงจากนั้นแป้นพิมพ์จะไม่ซ่อน


1
มันใช้งานได้กับ scrollview แต่ก็ยังมีบางกรณีที่ฉันสามารถคลิกปุ่มเพื่อเปลี่ยนมุมมองโดยใช้เนวิเกเตอร์และคีย์บอร์ดยังคงติดอยู่ที่ด้านล่างและต้องคลิกปุ่มย้อนกลับด้วยตนเองเพื่อปิด :(
Piyush Chauhan

1
คีย์บอร์ดจะซ่อนเมื่อคุณแตะที่นอก TextInput แต่หาก (แทนการแตะที่ด้านนอก) คุณจะแตะที่ TextInput อื่นและในที่สุดก็แตะที่นอกแป้นพิมพ์จะไม่ซ่อน ทดสอบกับ 0.6.0
jllodra

ฉันเห็นพฤติกรรมที่แตกต่างตอนนี้ การแตะนอก TextInput จะซ่อนแป้นพิมพ์แม้ว่าฉันจะแตะลงใน TextInput อื่นโดยตรงซึ่งเป็นปัญหาเพราะคุณต้องแตะสองครั้งบน TextInput อื่นเพื่อให้สามารถพิมพ์ได้! ถอนหายใจ (พร้อม RN 0.19)
Lane Rettig

1
คุณสามารถตั้งค่าการเลื่อนให้เป็นจริงและใช้ keyboardShouldPersistTaps = {'จัดการ'} และ keyboardDismissMode = {'on-drag'} เพื่อให้ได้
เอ

scrollview ใช้งานได้สำหรับฉันเท่านั้นฉันไม่รู้ว่าทำไมคำตอบที่ยอมรับได้เมื่อฉันป้อนแป้นพิมพ์ตัวเลขถูกไล่ออก
Yvon Huynh

33

คุณสามารถนำเข้า keyboardจากปฏิกิริยาตอบสนองเช่นด้านล่าง:

import { Keyboard } from 'react-native';

และในรหัสของคุณอาจเป็นดังนี้:

render() {
    return (
      <TextInput
        onSubmit={Keyboard.dismiss}
      />
    );
  }

เลิกจ้างแบบคงที่ ()

ปิดแป้นพิมพ์ที่ใช้งานอยู่และลบโฟกัส


static dismiss()ฉันไม่จำเป็นต้อง ฉันเพิ่งเพิ่มKeyboard.dismiss()วิธีการ onSubmit ของฉัน (ที่onSubmitEditing={() => {this.onSubmit()}})
SherylHohman

30

ฉันใหม่เอี่ยมสำหรับ React และพบปัญหาเดียวกันในขณะที่สร้างแอพตัวอย่าง หากคุณใช้ไม้onStartShouldSetResponderค้ำยัน (อธิบายไว้ที่นี่ ) คุณสามารถหยิบจับสิ่งเก่า ๆReact.Viewได้ อยากฟังความคิดของผู้ตอบโต้ที่มีประสบการณ์มากขึ้นเกี่ยวกับกลยุทธ์นี้ / หากมีสิ่งที่ดีกว่า แต่นี่คือสิ่งที่ได้ผลสำหรับฉัน:

containerTouched(event) {
  this.refs.textInput.blur();
  return false;
}

render() {
  <View onStartShouldSetResponder={this.containerTouched.bind(this)}>
    <TextInput ref='textInput' />
  </View>
}

2 สิ่งที่ควรทราบที่นี่ ก่อนอื่นดังที่กล่าวไว้ที่นี่ยังไม่มีวิธีสิ้นสุดการแก้ไขการดูทั้งหมดดังนั้นเราจึงต้องอ้างอิงTextInputโดยตรงเพื่อทำให้ภาพเบลอ ประการที่สองonStartShouldSetResponderจะถูกดักจับโดยตัวควบคุมแบบสัมผัสอื่น ๆ ที่ด้านบนของมัน ดังนั้นการคลิกที่TouchableHighlightetc (รวมถึงอื่น ๆTextInput) ในมุมมองคอนเทนเนอร์จะไม่ทำให้เกิดเหตุการณ์ อย่างไรก็ตามการคลิกImageที่มุมมองภายในคอนเทนเนอร์จะยังคงเป็นการยกเลิกแป้นพิมพ์


มันได้ผลแน่นอน แต่อย่างที่คุณพูดฉันอยากรู้เช่นกันถ้านี่เป็นวิธีที่ถูกต้อง หวังว่าพวกเขาจะแก้ปัญหาได้ในไม่ช้า ( github.com/facebook/react-native/issues/113 )
mutp

เยี่ยมมากสำหรับฉัน มุมมองเลื่อนของฉันไม่ทำงานกับวิธีการแบบสัมผัส! ขอบคุณ!
James Trickey

24

ใช้ScrollViewแทนViewและตั้งค่าkeyboardShouldPersistTapsคุณลักษณะเป็นเท็จ

<ScrollView style={styles.container} keyboardShouldPersistTaps={false}>
    <TextInput
        placeholder="Post Title"
        onChange={(event) => this.updateTitle(event.nativeEvent.text)}
        style={styles.default}/>
 </ScrollView>

ตามเอกสารที่มีค่าเริ่มต้นแอตทริบิวต์เท็จเมื่อใช้keyboardShouldPersistTaps ScrollViewฉันเพิ่งอัปเดตการโต้ตอบดั้งเดิมของฉันเป็นเวอร์ชันล่าสุดและปัญหาของการสลับเป็นวินาทีTextInputยังคงอยู่ คีย์บอร์ดจะไม่สามารถทำการไล่ออกได้ คุณพบวิธีแก้ปัญหาสำหรับปัญหาเฉพาะนี้หรือไม่?
TurboFish

1
เอกสารไม่ถูกต้อง แต่ได้รับการอัปเดตแล้วโปรดดู PR: github.com/facebook/react-native/issues/2150
Ryan McDermott

อะไรkeyboardShouldPersistTapsทำอย่างไร ทำไมมันเกี่ยวข้องที่นี่? ขอบคุณ
Lane Rettig

1
คำเตือน: 'keyboardShouldPersistTaps = {false}' เลิกใช้แล้ว ใช้ 'keyboardShouldPersistTaps = "ไม่เคย" แทน
Milan Rakos

13

หากมีคนต้องการตัวอย่างการทำงานของวิธีการยกเลิกการป้อนข้อความหลายบรรทัดที่นี่คุณไป! หวังว่าสิ่งนี้จะช่วยให้บางคนออกไปที่นั่นเอกสารไม่ได้อธิบายวิธีการยกเลิกการป้อนข้อมูลแบบหลายบรรทัดเลยอย่างน้อยก็ไม่มีการอ้างอิงที่เฉพาะเจาะจงเกี่ยวกับวิธีการทำ ยังคงเป็น noob ที่จะโพสต์ที่นี่จริง ๆ ในสแต็คถ้าใครคิดว่านี่ควรอ้างอิงถึงโพสต์จริงตัวอย่างนี้เขียนเพื่อแจ้งให้เราทราบ

import React, { Component } from 'react'
import {
  Keyboard,
  TextInput,
  TouchableOpacity,
  View,
  KeyboardAvoidingView,
} from 'react-native'

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      behavior: 'position',
    }
    this._keyboardDismiss = this._keyboardDismiss.bind(this)
  }

  componentWillMount() {
    this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide);
  }

  componentWillUnmount() {
    this.keyboardDidHideListener.remove()
  }

  _keyboardDidHide() {
    Keyboard.dismiss()
  }

  render() {
    return (
      <KeyboardAvoidingView
        style={{ flex: 1 }}
        behavior={this.state.behavior}
      >
        <TouchableOpacity onPress={this._keyboardDidHide}>
          <View>
            <TextInput
              style={{
                color: '#000000',
                paddingLeft: 15,
                paddingTop: 10,
                fontSize: 18,
              }}
              multiline={true}
              textStyle={{ fontSize: '20', fontFamily: 'Montserrat-Medium' }}
              placeholder="Share your Success..."
              value={this.state.text}
              underlineColorAndroid="transparent"
              returnKeyType={'default'}
            />
          </View>
        </TouchableOpacity>
      </KeyboardAvoidingView>
    )
  }
}

11

อัปเดตการใช้งานของ ScrollViewสำหรับReact Native 0.39

<ScrollView scrollEnabled={false} contentContainerStyle={{flex: 1}} />

แม้ว่าจะยังมีปัญหากับสองTextInputกล่อง เช่น. รูปแบบชื่อผู้ใช้และรหัสผ่านจะยกเลิกคีย์บอร์ดเมื่อสลับระหว่างอินพุต ชอบที่จะได้รับข้อเสนอแนะบางอย่างเพื่อให้แป้นพิมพ์ยังมีชีวิตอยู่เมื่อมีการสลับระหว่างในขณะที่ใช้TextInputsScrollView


3
ปรากฏว่า0.40การปรับปรุงkeyboardShouldPersistTapsจากbooleanไปยังenumมีมูลค่าเป็นไปได้ของ 'handled` ซึ่งเป็นสมมติว่าการแก้ไขปัญหานี้
Anshul Koka

11

มีสองสามวิธีถ้าคุณควบคุมเหตุการณ์เช่นonPressคุณสามารถใช้:

import { Keyboard } from 'react-native'

onClickFunction = () => {
     Keyboard.dismiss()
}

หากคุณต้องการปิดแป้นพิมพ์เมื่อใช้การเลื่อน:

<ScrollView keyboardDismissMode={'on-drag'}>
     //content
</ScrollView>

ตัวเลือกเพิ่มเติมคือเมื่อผู้ใช้คลิกที่นอกแป้นพิมพ์:

<KeyboardAvoidingView behavior='padding' style={{ flex: 1}}>
    //inputs and other content
</KeyboardAvoidingView>

1
พวกคำถามยังคงเป็นจริง แต่คำถามคือ 4 ปี (สิ้นสุด 2019 ตอนนี้) ตอนนี้ RN นั้นง่ายและใช้งานง่าย เราต้องทบทวนความสามารถทั้งหมดด้วยความช่วยเหลือของเราสามารถบรรลุทางออกสำหรับคำถามนี้ ให้โหวตความคิดเห็นนี้!
ลิงก์

@Link สวัสดีขอบคุณ! ฉันเห็นด้วยอย่างยิ่ง
Idan

10
const dismissKeyboard = require('dismissKeyboard');
dismissKeyboard(); //dismisses it

วิธีการ # 2;

ขอบคุณ user @ ricardo-stuven สำหรับการชี้สิ่งนี้มีอีกวิธีที่ดีกว่าในการยกเลิกคีย์บอร์ดซึ่งคุณสามารถดูได้จากตัวอย่างในเอกสารเนทีฟแบบตอบโต้

วิธีการนำเข้าKeyboardและโทรอย่างง่ายdismiss()


1
นี่เป็นสิ่งที่เทียบเท่ากับ Keyboard.dismiss ซึ่งเป็นที่นิยมมากกว่าเนื่องจากมีการบันทึกไว้ github.com/facebook/react-native/blob/…
Ricardo Stuven

ในขณะที่ฉันตอบคำถามนี้นี่ไม่ใช่เอกสาร ขอบคุณที่พูดถึงมัน ฉันจะอัปเดตคำตอบของฉัน
Adeel Imran

10

การห่อส่วนประกอบของคุณใน a TouchableWithoutFeedbackอาจทำให้เกิดพฤติกรรมการเลื่อนที่แปลกประหลาดและปัญหาอื่น ๆ ฉันชอบที่จะปิดแอพที่สูงที่สุดของฉันViewด้วยonStartShouldSetResponderคุณสมบัติที่ใส่เข้าไปซึ่งจะช่วยให้ฉันจัดการกับการสัมผัสที่ไม่ได้จัดการทั้งหมดแล้วจึงยกเลิกคีย์บอร์ด สิ่งสำคัญเนื่องจากฟังก์ชันตัวจัดการคืนค่าเท็จเหตุการณ์การสัมผัสถูกแพร่กระจายแบบปกติ

 handleUnhandledTouches(){
   Keyboard.dismiss
   return false;
 }

 render(){
    <View style={{ flex: 1 }} onStartShouldSetResponder={this.handleUnhandledTouches}>
       <MyApp>
    </View>
  }

ขอบคุณสำหรับคำตอบของคุณ @Scottmas ฉันลงเอยด้วยการใช้มันแทน TouchableWithoutFeedback เนื่องจากความคิดเห็น "พฤติกรรมการเลื่อนที่แปลกประหลาดและปัญหาอื่น ๆ " ของคุณ แต่ถ้าฉันไม่เชื่อใจในคำพูดของคุณคุณสามารถอธิบายความคิดเห็นของคุณได้ไหม? :)
kuhr

8

ฉันเพิ่งทดสอบสิ่งนี้โดยใช้ React Native เวอร์ชันล่าสุด (0.4.2) และแป้นพิมพ์จะถูกยกเลิกเมื่อคุณแตะที่อื่น

และ FYI: คุณสามารถตั้งค่าฟังก์ชั่นการโทรกลับที่จะดำเนินการเมื่อคุณยกเลิกคีย์บอร์ดโดยการกำหนดให้กับเสา "onEndEditing"


ฉันกำลังดีบั๊กการติดต่อกลับ "onEndEditing" แต่มันไม่เคยถูกเรียกมาก่อน ฉันจะตรวจสอบเรื่องนี้กับเจ้าของภาษาเวอร์ชั่นใหม่กว่าขอบคุณสำหรับคำแนะนำของคุณ
TurboFish

7

หากฉันไม่เข้าใจผิด React Native เวอร์ชันล่าสุดได้แก้ไขปัญหานี้แล้วว่าสามารถยกเลิกแป้นพิมพ์ได้โดยแตะที่ปุ่ม


4
คุณจะสามารถชี้ให้เห็นว่าส่วนใดของรหัส / เอกสารของพวกเขาทำเช่นนั้น? ฉันพบปัญหาเดียวกันและฉันซาบซึ้งมากที่มันชี้ทิศทางฉัน :)
Okazaki Miyama Yuta

ยืนยันว่าปัญหานี้ยังคงเป็นของ RN 0.19 (ล่าสุด)
Lane Rettig

ยังคงมีปัญหากับ RN 0.28
hippofluff

7

วิธีการเกี่ยวกับการวางองค์ประกอบที่สัมผัสได้รอบ / ข้างTextInput?

var INPUTREF = 'MyTextInput';

class TestKb extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <View style={{ flex: 1, flexDirection: 'column', backgroundColor: 'blue' }}>
                <View>
                    <TextInput ref={'MyTextInput'}
                        style={{
                            height: 40,
                            borderWidth: 1,
                            backgroundColor: 'grey'
                        }} ></TextInput>
                </View>
                <TouchableWithoutFeedback onPress={() => this.refs[INPUTREF].blur()}>
                    <View 
                        style={{ 
                            flex: 1, 
                            flexDirection: 'column', 
                            backgroundColor: 'green' 
                        }} 
                    />
                </TouchableWithoutFeedback>
            </View>
        )
    }
}

6

ห่อองค์ประกอบทั้งหมดของคุณด้วย:

import { TouchableWithoutFeedback, Keyboard } from 'react-native'

<TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
...
</TouchableWithoutFeedback>

ทำงานให้ฉัน



4

โมดูลแป้นพิมพ์ใช้เพื่อควบคุมเหตุการณ์แป้นพิมพ์

  • import { Keyboard } from 'react-native'
  • เพิ่มรหัสด้านล่างในวิธีการแสดงผล

    render() { return <TextInput onSubmitEditing={Keyboard.dismiss} />; }

คุณสามารถใช้ได้ -

Keyboard.dismiss()

การเลิกจ้างคงที่ () ยกเลิกแป้นพิมพ์ที่ใช้งานอยู่และลบโฟกัสตามเอกสารพื้นเมืองตอบสนอง


3

แป้นพิมพ์นำเข้าครั้งแรก

import { Keyboard } from 'react-native'

จากนั้นภายในของคุณTextInputคุณเพิ่มKeyboard.dismissไปยังonSubmitEditingเสา คุณควรมีสิ่งที่มีลักษณะเช่นนี้:

render(){
  return(
    <View>
      <TextInput 
        onSubmitEditing={Keyboard.dismiss}
       />
    </View>
  )  
}


2

การใช้งานkeyboardShouldPersistTapsในสิ่งที่ScrollViewคุณสามารถส่งผ่านใน "จัดการ" ซึ่งเกี่ยวข้องกับปัญหาที่ผู้คนพูดว่ามาพร้อมกับการใช้ ScrollView นี่คือสิ่งที่เอกสารบอกว่าเกี่ยวกับการใช้ 'จัดการ': ที่the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor). นี่มีการอ้างอิง


สิ่งนี้ได้ผลสำหรับฉัน! (อย่างไรก็ตามฉันต้องเพิ่มเข้าไปในห้องสมุดบุคคลที่สามของฉันreact-native-keyboard-aware-scroll-view)
Nick Grealy


1

มีหลายวิธีที่คุณสามารถจัดการกับสิ่งนี้ได้คำตอบข้างต้นไม่รวมreturnTypeเนื่องจากไม่รวมอยู่ในปฏิกิริยาตอบสนองในขณะนั้น

1: คุณสามารถแก้ไขได้ด้วยการห่อส่วนประกอบของคุณภายใน ScrollView โดยค่าเริ่มต้น ScrollView จะปิดแป้นพิมพ์หากเรากดที่ใดที่หนึ่ง แต่ในกรณีที่คุณต้องการใช้ ScrollView แต่ปิดการใช้งานเอฟเฟกต์นี้ คุณสามารถใช้ pointerEvent prop เพื่อ scrollView pointerEvents = 'none'scrollview

2: หากคุณต้องการปิดแป้นพิมพ์ด้วยการกดปุ่มคุณสามารถใช้Keyboardจากreact-native

import { Keyboard } from 'react-native' and inside onPress of that button, you can useKeyboard.dismiss ()'

3: คุณสามารถปิดแป้นพิมพ์เมื่อคุณคลิกปุ่มส่งคืนบนแป้นพิมพ์ได้หมายเหตุ: หากประเภทแป้นพิมพ์ของคุณเป็นตัวเลขคุณจะไม่มีปุ่มส่งคืน ดังนั้นคุณสามารถเปิดใช้งานได้โดยให้มันเสา, returnKeyType doneไป หรือคุณสามารถใช้onSubmitEditing={Keyboard.dismiss}มันจะถูกเรียกเมื่อใดก็ตามที่เรากดปุ่มย้อนกลับ และหากคุณต้องการยกเลิกคีย์บอร์ดเมื่อไม่สามารถโฟกัสได้คุณสามารถใช้เสาสีฟ้าonBlur = {Keyboard.dismiss}


0

Keyboard.dismiss()จะทำมัน แต่บางครั้งมันอาจสูญเสียโฟกัสและแป้นพิมพ์จะไม่สามารถค้นหาการอ้างอิง วิธีที่สอดคล้องที่สุดในการทำคือใส่ref=_refลงใน textInput และทำ_ref.blur()เมื่อคุณต้องการยกเลิกและ_ref.focus()เมื่อคุณต้องนำคีย์บอร์ดกลับมา



0

นี่คือวิธีแก้ปัญหาของฉันสำหรับการยกคีย์บอร์ดและเลื่อนไปแตะ TextInput (ฉันใช้ ScrollView กับ keyboardDismissMode prop):

import React from 'react';
import {
  Platform,
  KeyboardAvoidingView,
  ScrollView
} from 'react-native';

const DismissKeyboard = ({ children }) => {
  const isAndroid = Platform.OS === 'android';
  const behavior = isAndroid ? false : 'padding';

  return (
    <KeyboardAvoidingView
      enabled
      behavior={ behavior }
      style={{ flex: 1}}
    >
      <ScrollView
        keyboardShouldPersistTaps={'always'}
        keyboardDismissMode={'on-drag'}
      >
        { children }
      </ScrollView>
    </KeyboardAvoidingView>
  );
};

export default DismissKeyboard;

การใช้งาน:

render(){
   return(
     <DismissKeyboard>
       <TextInput
        style={{height: 40, borderColor: 'gray', borderWidth: 1}}
        onChangeText={(text) => this.setState({text})}
        value={this.state.text}
      />
     </DismissKeyboard>
   );
}


0

ใช้แพ็คเกจนี้ react-native-keyboard-aware-scroll-view

ใช้องค์ประกอบนั้นเป็นองค์ประกอบหลักของคุณ

เนื่องจากแพ็คเกจreact-native-keyboard-aware-scroll-viewนี้มี scrollView คุณจึงต้องเพิ่มมันเข้าไป:

<KeyboardAwareScrollView keyboardShouldPersistTaps="handled"> <ScrollView keyboardShouldPersistTaps="handled"></ScrollView> </KeyboardAwareScrollView>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.