Jeśli dotknę wejścia tekstowego, chcę mieć możliwość stuknięcia w innym miejscu, aby ponownie zwolnić klawiaturę (ale nie klawisz powrotu). Nie znalazłem najmniejszych informacji na ten temat we wszystkich samouczkach i postach na blogu, które przeczytałem.
Ten podstawowy przykład wciąż nie działa dla mnie w środowisku Native 0.4.2 w Symulatorze. Nie mogłem jeszcze wypróbować tego na moim iPhonie.
<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>
react-native
TurboFish
źródło
źródło
Odpowiedzi:
Problem z nieodrzucaniem klawiatury staje się poważniejszy, jeśli masz
keyboardType='numeric'
, ponieważ nie ma możliwości jej odrzucenia.Zastąpienie widoku ScrollView nie jest prawidłowym rozwiązaniem, ponieważ jeśli masz wiele
textInput
s lubbutton
s, stuknięcie ich przy podniesionej klawiaturze spowoduje tylko zwolnienie klawiatury.Prawidłowym sposobem jest hermetyzowanie widoku za pomocą
TouchableWithoutFeedback
i wywoływaniaKeyboard.dismiss()
EDYCJA: Możesz teraz używać
ScrollView
z,keyboardShouldPersistTaps='handled'
aby zamknąć klawiaturę tylko wtedy, gdy dzieci nie obsługują stuknięcia (tj. Stukanie w inne wejścia tekstowe lub przyciski)Jeśli masz
Zmień to na
lub
EDYCJA: Możesz również utworzyć komponent wyższego rzędu, aby zamknąć klawiaturę.
Po prostu użyj tego w ten sposób
UWAGA:
accessible={false}
jest to konieczne, aby formularz wprowadzania był nadal dostępny za pośrednictwem VoiceOver. Ludzie niedowidzący będą ci wdzięczni!źródło
const DismissKeyboardHOC = (Comp) => {
onPress
doTouchableWithoutFeedback
pożaru bez względu na to, co próbujęTo właśnie zostało zaktualizowane i udokumentowane ! Nigdy więcej ukrytych sztuczek.
https://github.com/facebook/react-native/pull/9925
źródło
użyj tego do niestandardowego zwolnienia
źródło
react-native-search-bar
Użyj React Native's
Keyboard.dismiss()
Zaktualizowana odpowiedź
React Native ujawnił
dismiss()
metodę statycznąKeyboard
, więc zaktualizowana metoda to:Oryginalna odpowiedź
Użyj
dismissKeyboard
biblioteki React Native .Miałem bardzo podobny problem i czułem, że tylko ja go nie dostałem.
ScrollViews
Jeśli masz
ScrollView
, lub cokolwiek, co dziedziczy po niej jak aListView
, możesz dodać rekwizyt, który automatycznie zwolni klawiaturę na podstawie naciśnięcia lub przeciągnięcia zdarzeń.Podpora jest
keyboardDismissMode
i może mieć wartośćnone
,interactive
alboon-drag
. Możesz przeczytać więcej na ten temat tutaj .Regularne widoki
Jeśli masz coś innego niż a
ScrollView
i chciałbyś, aby jakieś prasy odrzuciły klawiaturę, możesz użyć prostejTouchableWithoutFeedback
ionPress
skorzystać z biblioteki narzędzi React Native,dismissKeyboard
aby zwolnić klawiaturę.W twoim przykładzie możesz zrobić coś takiego:
Uwaga:
TouchableWithoutFeedback
może mieć tylko jedno dziecko, więc musisz zawinąć wszystko pod nim w jedno,View
jak pokazano powyżej.źródło
dismiss()
metodę na klawiaturze, tak zaktualizowana metoda jest:import { Keyboard } from 'react-native'; Keyboard.dismiss()
.Keyboard.dismiss()
nic nie robi, ponieważ jego wdrożenie zależy od skupienia się na danych wejściowych, którymi już nie jestem.Prostą odpowiedzią jest użycie ScrollView zamiast View i ustawienie właściwości przewijalnej na false (może być jednak konieczne dostosowanie niektórych stylów).
W ten sposób klawiatura zostaje zwolniona w momencie, gdy stukam gdzie indziej. Może to być problem z reakcją natywną, ale zdaje się, że zdarzenia dotknięcia są obsługiwane tylko przez ScrollViews, co prowadzi do opisanego zachowania.
Edycja: Dzięki jllodra. Pamiętaj, że jeśli dotkniesz bezpośrednio innego Textinput, a następnie na zewnątrz, klawiatura nadal się nie ukryje.
źródło
Możesz importować
keyboard
z responsive-native, jak poniżej:a w twoim kodzie może być coś takiego:
źródło
static dismiss()
. Właśnie dodałemKeyboard.dismiss()
do mojej metody onSubmit (gdzieonSubmitEditing={() => {this.onSubmit()}})
Jestem zupełnie nowy w React i napotkałem dokładnie ten sam problem podczas tworzenia aplikacji demonstracyjnej. Jeśli użyjesz
onStartShouldSetResponder
rekwizytu (opisanego tutaj ), możesz chwycić zwykły staryReact.View
. Ciekawi mnie, jak bardziej doświadczeni Reaktorzy zastanawiają się nad tą strategią / jeśli jest lepsza, ale to działało dla mnie:2 rzeczy do odnotowania tutaj. Po pierwsze, jak omówiono tutaj , nie ma jeszcze sposobu na zakończenie edycji wszystkich widoków podrzędnych, więc musimy odwoływać się do
TextInput
bezpośrednio, aby go rozmazać. Po drugie,onStartShouldSetResponder
są przechwytywane przez inne dotykowe elementy sterujące na nim. Zatem kliknięcieTouchableHighlight
itp. (W tym innejTextInput
) w widoku kontenera nie spowoduje zdarzenia. Jednak kliknięcieImage
w widoku kontenera nadal powoduje zwolnienie klawiatury.źródło
Użyj
ScrollView
zamiastView
i ustawkeyboardShouldPersistTaps
atrybut na false.źródło
keyboardShouldPersistTaps
domyślnie atrybut ma wartość false, gdy używaszScrollView
. Właśnie zaktualizowałem moją reakcyjną wersję macierzystą do najnowszej wersji i problem z przejściem na sekundęTextInput
nadal występuje. Klawiatura nie jest zatem niedopuszczalna. Czy znalazłeś rozwiązanie tego konkretnego problemu?keyboardShouldPersistTaps
zrobić? Dlaczego ma to znaczenie tutaj? DziękiJeśli ktoś potrzebuje działającego przykładu, jak odrzucić wprowadzanie tekstu wielowierszowego tutaj, proszę! Mam nadzieję, że to pomaga niektórym ludziom, doktorzy w ogóle nie opisują sposobu na odrzucenie wielowierszowego wkładu, przynajmniej nie było konkretnego odniesienia do tego, jak to zrobić. Nadal jest to noob do zamieszczania tutaj na stosie, jeśli ktoś uważa, że powinno to być odniesienie do faktycznego postu, dla którego ten fragment został napisany, daj mi znać.
źródło
Zaktualizowano użycie
ScrollView
dlaReact Native 0.39
Chociaż nadal jest problem z dwoma
TextInput
pudełkami. na przykład. Nazwa użytkownika i hasło odłączyłyby teraz klawiaturę podczas przełączania między wejściami. Chciałbym uzyskać kilka wskazówek, aby utrzymać klawiaturę przy przełączaniu sięTextInputs
podczas korzystania zScrollView
.źródło
0.40
aktualizacjekeyboardShouldPersistTaps
od aboolean
doenum
z możliwą wartością „obsłużoną”, co powinno to naprawić.Istnieje kilka sposobów kontrolowania zdarzenia, takich jak
onPress
można użyć:jeśli chcesz zamknąć klawiaturę podczas przewijania:
Więcej opcji występuje, gdy użytkownik kliknie poza klawiaturą:
źródło
Podejście nr 2;
Dzięki użytkownikowi @ ricardo-stuven za wskazanie tego, istnieje inny lepszy sposób na zwolnienie klawiatury, który można zobaczyć w przykładzie w reakcyjnych natywnych dokumentach.
Prosty import
Keyboard
i wywołanie metodydismiss()
źródło
Zawijanie komponentów
TouchableWithoutFeedback
może powodować dziwne zachowanie przewijania i inne problemy. Wolę, by zakończyć moją najwyższą aplikację w sposóbView
zonStartShouldSetResponder
własności wypełnione. To pozwoli mi obsłużyć wszystkich nieobsłużonych poprawki, a następnie schować klawiaturę. Co ważne, ponieważ funkcja modułu obsługi zwraca wartość false, zdarzenie dotyku jest propagowane jak zwykle.źródło
Właśnie przetestowałem to przy użyciu najnowszej wersji React Native (0.4.2), a klawiatura zostanie zwolniona po stuknięciu w innym miejscu.
I FYI: możesz ustawić funkcję wywołania zwrotnego, która będzie wykonywana po zwolnieniu klawiatury, przypisując ją do propa „onEndEditing”.
źródło
Jeśli się nie mylę, najnowsza wersja React Native rozwiązała problem polegający na możliwości zwolnienia klawiatury poprzez stuknięcie.
źródło
Co powiesz na umieszczenie dotykalnego elementu wokół / obok
TextInput
?źródło
Owiń cały komponent:
Pracował dla mnie
źródło
https://facebook.github.io/react-native/docs/keyboard.html
Posługiwać się
aby ukryć klawiaturę.
źródło
Moduł klawiatury służy do sterowania zdarzeniami na klawiaturze.
import { Keyboard } from 'react-native'
Dodaj poniższy kod w metodzie renderowania.
render() { return <TextInput onSubmitEditing={Keyboard.dismiss} />; }
Możesz użyć -
źródło
Najpierw zaimportuj klawiaturę
Następnie
TextInput
dodajKeyboard.dismiss
doonSubmitEditing
rekwizytu. Powinieneś mieć coś, co wygląda tak:źródło
Używając
keyboardShouldPersistTaps
w tymScrollView
można przekazać „obsłużony”, który zajmuje się problemami, które mówią ludzie, związane z używaniem ScrollView. Oto, co dokumentacja mówi o używaniu „obsłużonego”:the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor).
tutaj jest odniesienie.źródło
react-native-keyboard-aware-scroll-view
).w
ScrollView
użyciuTo spełni twoje zadanie.
źródło
Istnieje wiele sposobów, aby sobie z tym poradzić, powyższe odpowiedzi nie obejmują,
returnType
ponieważ nie zostały uwzględnione w tym czasie w trybie macierzystym.1: Możesz to rozwiązać, zawijając komponenty w ScrollView, domyślnie ScrollView zamyka klawiaturę, jeśli gdzieś naciśniemy. Ale jeśli chcesz użyć ScrollView, ale wyłącz ten efekt. możesz użyć prop pointerEvent do scrollView
pointerEvents = 'none'
.2: Jeśli chcesz zamknąć klawiaturę po naciśnięciu przycisku, możesz po prostu użyć
Keyboard
zreact-native
import { Keyboard } from 'react-native' and inside onPress of that button, you can use
Keyboard.dismiss () ”.3: Możesz także zamknąć klawiaturę po kliknięciu klawisza Return na klawiaturze, UWAGA: jeśli typ klawiatury jest numeryczny, nie będziesz miał klawisza Return. Możesz go włączyć, podając prop, returnKeyType na
done
. lub możesz użyćonSubmitEditing={Keyboard.dismiss}
, Zostanie wywołany za każdym razem, gdy naciśniemy klawisz powrotu. A jeśli chcesz zwolnić klawiaturę po utracie ostrości, możesz użyć prop onBlur,onBlur = {Keyboard.dismiss}
źródło
Keyboard.dismiss()
zrobię to. Ale czasami może stracić ostrość i klawiatura nie będzie w stanie znaleźć referencji. Najbardziej konsekwentnym sposobem jest wstawienie parametruref=_ref
do textInput i zrobienie tego,_ref.blur()
gdy trzeba go zamknąć i_ref.focus()
przywrócić klawiaturę.źródło
wypróbować
keyboard.dismiss()
. To zadziałało dla mnieźródło
Oto moje rozwiązanie usuwania klawiatury i przewijania do stukniętego TextInput (używam ScrollView z propozycją keyboardDismissMode):
stosowanie:
źródło
użyj tego pakietu
react-native-keyboard-aware-scroll-view
użyj tego komponentu jako komponentu głównego
ponieważ ten pakiet
react-native-keyboard-aware-scroll-view
ma również scrollView, musisz dodać do niego:<KeyboardAwareScrollView keyboardShouldPersistTaps="handled"> <ScrollView keyboardShouldPersistTaps="handled"></ScrollView> </KeyboardAwareScrollView>
źródło