How to hide the keyboard in React Native on tapping outside of TextInput:
This is a common problem and expected behavior in a mobile application. Suppose we have multiple TextInput components in a row and we need to hide the keyboard if the user clicks on anywhere outside.
This can be implemented in different ways in React Native. In this post, I will show you two different ways to solve this problem with a mini React Native project.
Method 1: By using a ScrollView:
We can simply add the items in a ScrollView and it will handle the keyboard automatically, i.e. if the user taps anywhere on ScrollView that is not a TextInput, the keyboard will be hidden.
Let’s try it with a simple project. Create one basic React Native project and replace the App.tsx file with the following:
import React from "react";
import {
SafeAreaView,
ScrollView,
StyleSheet,
TextInput,
View,
Button,
} from "react-native";
function App(): React.JSX.Element {
return (
<SafeAreaView>
<ScrollView
style={styles.scrollStyle}
contentContainerStyle={styles.containerStyle}
>
<View style={styles.headerView} />
<TextInput style={styles.input} />
<TextInput style={styles.input} />
<View style={styles.buttonView}>
<Button title="click me" />
</View>
</ScrollView>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
containerStyle: {
alignItems: "center",
flexGrow: 1,
},
scrollStyle: {
height: "100%",
},
headerView: { height: 100, width: "80%", margin: 10, backgroundColor: "red" },
input: {
width: 300,
margin: 10,
borderWidth: 1,
padding: 10,
fontSize: 20,
},
buttonView: { width: 200 },
});
export default App;This screen has one ScrollView with one View, two TextInput components and one more Button in a column. If you run this app, it will load the following screen:
If you click outside the TextInput, it will hide the keyboard.
Method 2: By using the Keyboard module:
The problem with the above method is that it will hide the keyboard even if we click on the Button. If you click on the button, it will hide the keyboard and on the second click it will click on the button. One way to fix this is by passing keyboardShouldPersistTaps='handled' props to the ScrollView. It will not hide the keyboard if we click on any component of the ScrollView.
React Native provides a module to handle and listen to keyboard events. It has one method called dismiss to dismiss the keyboard manually.
We can use a TouchableWithoutFeedback as the parent component and call this method on onPress prop.
import React from "react";
import {
SafeAreaView,
TouchableWithoutFeedback,
StyleSheet,
TextInput,
View,
Button,
Keyboard,
} from "react-native";
function App(): React.JSX.Element {
return (
<SafeAreaView>
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.parent}>
<View style={styles.headerView} />
<TextInput style={styles.input} />
<TextInput style={styles.input} />
<View style={styles.buttonView}>
<Button title="click me" />
</View>
</View>
</TouchableWithoutFeedback>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
parent: {
height: "100%",
alignItems: "center",
},
headerView: { height: 100, width: "80%", margin: 10, backgroundColor: "red" },
input: {
width: 300,
margin: 10,
borderWidth: 1,
padding: 10,
fontSize: 20,
},
buttonView: { width: 200 },
});
export default App;It will hide the keyboard if the user taps anywhere outside the TextInput components. The button click will not hide the keyboard. It will click on the button.
By using a HOC:
We can use a higher order component or HOC to take the component as its child. We can write it as below in TypeScript:
type KeyboardDismissTouchableProps = {
children: React.ReactNode,
};
const KeyboardDismissTouchable = ({
children,
}: KeyboardDismissTouchableProps) => (
<TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
{children}
</TouchableWithoutFeedback>
);Use it in any other file:
function App(): React.JSX.Element {
return (
<SafeAreaView>
<KeyboardDismissTouchable>
<View style={styles.parent}>
<View style={styles.headerView} />
<TextInput style={styles.input} />
<TextInput style={styles.input} />
<View style={styles.buttonView}>
<Button title="click me" />
</View>
</View>
</KeyboardDismissTouchable>
</SafeAreaView>
);
}It will work similarly to the previous example.
You might also like:
- How to show pdf files in react native applications
- How to add scroll to top to a FlatList in ReactNative app
- How to change the background color of a View dynamically in React Native
- How to read platform-specific values in React Native
- How to use SVG or vector images in React native
- 3 ways to create platform-specific designs in React Native
- How to change the text size of TextInput in React Native
