Se eu tocar em uma entrada de texto, desejo poder tocar em outro lugar para descartar o teclado novamente (mas não a tecla de retorno). Não encontrei a menor informação sobre isso em todos os tutoriais e postagens do blog que li.
Este exemplo básico ainda não está funcionando para mim com o 0.4.2 react-native no Simulator. Ainda não foi possível experimentá-lo no meu 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>
react-native
TurboFish
fonte
fonte
Respostas:
O problema com o teclado não dispensar fica mais grave se você tiver
keyboardType='numeric'
, pois não há como descartá-lo.Substituir o View pelo ScrollView não é uma solução correta, como se você tivesse vários
textInput
s oubutton
s, tocar neles enquanto o teclado estiver levantado só descartará o teclado.A maneira correta é encapsular o View com
TouchableWithoutFeedback
e chamarKeyboard.dismiss()
EDIT: Agora você pode usar
ScrollView
comkeyboardShouldPersistTaps='handled'
para descartar o teclado apenas quando a torneira não é manuseada pelas crianças (por exemplo, tocando em outros textos).Se você tem
Mude para
ou
EDIT: Você também pode criar um componente de ordem superior para descartar o teclado.
Basta usá-lo assim
NOTA:
accessible={false}
é necessário para que o formulário de entrada continue acessível pelo VoiceOver. Pessoas com deficiência visual agradecerão!fonte
const DismissKeyboardHOC = (Comp) => {
onPress
paraTouchableWithoutFeedback
a fogo, não importa o que eu tentoIsso acabou de ser atualizado e documentado ! Não há mais truques ocultos.
https://github.com/facebook/react-native/pull/9925
fonte
use isso para dispensa personalizada
fonte
react-native-search-bar
Use o React Native
Keyboard.dismiss()
Resposta atualizada
O React Native expôs o
dismiss()
método estático noKeyboard
, portanto, o método atualizado é:Resposta original
Use o React Native
dismissKeyboard
biblioteca .Eu tive um problema muito semelhante e senti que era o único que não entendia.
ScrollViews
Se você tem um
ScrollView
, ou qualquer coisa que herda dele como umListView
, você pode adicionar um suporte que descartará automaticamente o teclado com base em eventos de pressionar ou arrastar.O suporte é
keyboardDismissMode
e pode ter um valor denone
,interactive
ouon-drag
. Você pode ler mais sobre isso aqui .Visualizações regulares
Se você tiver algo diferente de a
ScrollView
e desejar pressionar o teclado, use um simplesTouchableWithoutFeedback
eonPress
use a biblioteca de utilitários do React NativedismissKeyboard
para dispensar o teclado para você.No seu exemplo, você pode fazer algo assim:
Nota:
TouchableWithoutFeedback
só pode ter um único filho, portanto, você precisa agrupar tudo abaixo dele em um único,View
como mostrado acima.fonte
dismiss()
método no teclado, então o método atualizado é:import { Keyboard } from 'react-native'; Keyboard.dismiss()
.Keyboard.dismiss()
, nada faz, pois sua implementação depende de se concentrar em uma entrada, o que eu não sou mais.A resposta simples é usar um ScrollView em vez de View e definir a propriedade rolável como false (pode ser necessário ajustar alguns estilos).
Dessa forma, o teclado é dispensado no momento em que toco em outro lugar. Isso pode ser um problema no react-native, mas os eventos de toque parecem ser tratados apenas com o ScrollViews, o que leva ao comportamento descrito.
Edit: Graças a jllodra. Observe que, se você tocar diretamente em outra entrada de texto e depois sair, o teclado ainda não será oculto.
fonte
Você pode importar
keyboard
do react-native como abaixo:e no seu código pode ser algo como isto:
fonte
static dismiss()
. Eu só acrescentouKeyboard.dismiss()
ao meu método onSubmit (ondeonSubmitEditing={() => {this.onSubmit()}})
Sou novato no React e tive exatamente o mesmo problema ao criar um aplicativo de demonstração. Se você usar o
onStartShouldSetResponder
suporte (descrito aqui ), poderá tocar em um velho simplesReact.View
. Curioso para ouvir os pensamentos dos Reagentes mais experientes sobre essa estratégia / se houver uma melhor, mas é isso que funcionou para mim:2 coisas a serem observadas aqui. Primeiro, como discutido aqui , ainda não há uma maneira de terminar a edição de todas as subvisões, portanto, precisamos nos referir
TextInput
diretamente ao para desfocá-lo. Segundo, eleonStartShouldSetResponder
é interceptado por outros controles palpáveis sobre ele. Portanto, clicar em umTouchableHighlight
etc (incluindo outroTextInput
) na visualização do contêiner não acionará o evento. No entanto, clicar em umaImage
exibição dentro do contêiner ainda descartará o teclado.fonte
Use em
ScrollView
vez deView
e defina okeyboardShouldPersistTaps
atributo como false.fonte
keyboardShouldPersistTaps
atributo padrão é false ao usar aScrollView
. Acabei de atualizar meu react-native para a versão mais recente e o problema de mudar para um segundoTextInput
ainda persiste. O teclado não é descartável. Você encontrou uma solução para esse problema específico?keyboardShouldPersistTaps
faz? Por que é relevante aqui? ObrigadoSe alguém precisar de um exemplo prático de como descartar uma entrada de texto com várias linhas, aqui está! Espero que isso ajude algumas pessoas por aí, os documentos não descrevem uma maneira de descartar uma entrada de várias linhas, pelo menos não houve referência específica sobre como fazê-lo. Ainda é um noob para realmente postar aqui na pilha, se alguém achar que isso deve ser uma referência à postagem real em que este snippet foi escrito para me avisar.
fonte
Uso atualizado de
ScrollView
paraReact Native 0.39
Embora ainda haja um problema com duas
TextInput
caixas. por exemplo. Um formulário de nome de usuário e senha agora descartaria o teclado ao alternar entre entradas. Gostaria de receber algumas sugestões para manter o teclado ativo ao alternar entreTextInputs
enquanto usa umScrollView
.fonte
0.40
atualizaçõeskeyboardShouldPersistTaps
de umboolean
para umenum
com um possível valor de 'manipulado', que é suposto corrigir isso.Existem algumas maneiras, se você controla um evento como
onPress
você pode usar:se você deseja fechar o teclado quando usar a rolagem:
Mais opção é quando o usuário clica fora do teclado:
fonte
Abordagem nº 2;
Obrigado ao usuário @ ricardo-stuven por apontar isso, há outra maneira melhor de descartar o teclado que você pode ver no exemplo nos documentos nativos do react.
Importação simples
Keyboard
e chame seu métododismiss()
fonte
A quebra de seus componentes em um
TouchableWithoutFeedback
pode causar um comportamento estranho de rolagem e outros problemas. Prefiro agrupar meu aplicativo superior em umView
com aonStartShouldSetResponder
propriedade preenchida. Isso me permitirá lidar com todos os toques sem tratamento e depois dispensar o teclado. É importante ressaltar que, como a função do manipulador retorna false, o evento touch é propagado como normal.fonte
Acabei de testar isso usando a versão mais recente do React Native (0.4.2), e o teclado é descartado quando você toca em outro lugar.
E FYI: você pode definir uma função de retorno de chamada a ser executada quando você ignora o teclado, atribuindo-o ao suporte "onEndEditing".
fonte
Se não me engano, a versão mais recente do React Native resolveu esse problema de poder descartar o teclado tocando.
fonte
Que tal colocar um componente palpável ao redor / ao lado do
TextInput
?fonte
Enrole todo o seu componente com:
Trabalhou para mim
fonte
https://facebook.github.io/react-native/docs/keyboard.html
Usar
ocultar o teclado.
fonte
O módulo do teclado é usado para controlar eventos do teclado.
import { Keyboard } from 'react-native'
Adicione o código abaixo no método de renderização.
render() { return <TextInput onSubmitEditing={Keyboard.dismiss} />; }
Você pode usar -
fonte
Primeira importação do teclado
Então, dentro do seu,
TextInput
você adicionaKeyboard.dismiss
aoonSubmitEditing
suporte. Você deve ter algo parecido com isto:fonte
Usando
keyboardShouldPersistTaps
noScrollView
você pode passar "manipulado", que lida com os problemas que as pessoas estão dizendo que vêm com o uso do ScrollView. Isto é o que a documentação diz sobre o uso de 'manipulado':the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor).
Aqui é onde é referenciado.fonte
react-native-keyboard-aware-scroll-view
).em
ScrollView
usoIsso fará o seu trabalho.
fonte
Existem várias maneiras de lidar com isso, as respostas acima não incluem,
returnType
pois não foram incluídas no nativo do reagir naquele momento.1: Você pode resolvê-lo envolvendo seus componentes dentro do ScrollView; por padrão, o ScrollView fecha o teclado se pressionarmos em algum lugar. Mas, caso você queira usar o ScrollView, desative esse efeito. você pode usar prop pointerEvent para scrollView
pointerEvents = 'none'
.2: Se você deseja fechar o teclado pressionando um botão, basta usar a
Keyboard
partir dereact-native
import { Keyboard } from 'react-native' and inside onPress of that button, you can use
Keyboard.dismiss () '.3: Você também pode fechar o teclado ao clicar na tecla de retorno do teclado. NOTA: se o seu tipo de teclado for numérico, você não terá uma tecla de retorno. Portanto, você pode habilitá-lo fornecendo uma proposta, returnKeyType para
done
. ou você pode usaronSubmitEditing={Keyboard.dismiss}
, ele é chamado sempre que pressionamos a tecla Enter. E se você quiser descartar o teclado ao perder o foco, poderá usar o suporte onBlur,onBlur = {Keyboard.dismiss}
fonte
Keyboard.dismiss()
vai fazer isso. Mas, às vezes, pode perder o foco e o Teclado não conseguirá encontrar o árbitro. A maneira mais consistente de fazer isso é colocar umref=_ref
no textInput e fazê-_ref.blur()
lo quando precisar dispensar e_ref.focus()
quando precisar devolver o teclado.fonte
experimente
keyboard.dismiss()
. Funcionou para mimfonte
Aqui está minha solução para descartar e rolar o teclado para TextInput tocado (estou usando o ScrollView com o suporte keyboardDismissMode):
uso:
fonte
use este pacote
react-native-keyboard-aware-scroll-view
use esse componente como seu componente raiz
Como este pacote
react-native-keyboard-aware-scroll-view
também possui um scrollView, você precisa adicioná-lo a ele:<KeyboardAwareScrollView keyboardShouldPersistTaps="handled"> <ScrollView keyboardShouldPersistTaps="handled"></ScrollView> </KeyboardAwareScrollView>
fonte