Реагировать родной - TouchableHighlight: удалить выделение после OnPress?
Я разрабатываю простое приложение на основе реагирования и сталкиваюсь с проблемой TouchableHighlight:
При нажатии TouchableHighlight
отображается новый экран (с помощью StackNavigator из react-navigation
). После нажатия кнопки "Назад" и возврата к исходному экрану TouchableHighlight
все еще имеет черный цвет фона - это означает, что он все еще выделен.
Мои вопросы:
- Есть ли способ вручную отключить выделение
TouchableHighlight
-составная часть? Таким образом, я мог отключить подсветку послеonPress
побежал. - Какие могут быть возможные причины, почему
TouchableHighlight
остается выделенным? Я использую его в других частях моего приложения без навигации, и я могу представить, что это связано с этим.
TouchableHighlight
существует в FlatList. Метод renderItems выглядит следующим образом:
let handlePress = () => {
this.props.navigation.navigate('DetailsScreen');
};
return <TouchableHighlight
onPress={handlePress}>
<Text>Some Text</Text>
</TouchableHighlight>;
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Я тестировал код на Android, используя Genymotion-эмулятор с Marshmallow.
Версии:
- узел -v: 8.9.4
- npm -v: 5.6.0
- response-native-cli: 2.0.1
- реактивный: 0.54.2
- реактивная навигация: 1.5.2
- Среда сборки: Windows 10 64-битная
На данный момент, я совершенно уверен, что ошибка где-то в моем коде, как TouchableHighlight
работает правильно на других частях моего приложения, и, вероятно, это связано с навигацией вызова, но я не смог точно определить, почему именно. Я убедился, что в моем приложении нет исключений или чего-то подобного и что метод onPress завершается успешно.
2 ответа
После использования подсказки от @Kartiikeya и обмена TouchableHighlight
с TouchableOpacity
и обратно к TouchableHighlight
теперь он работает как положено:
Теперь, после onPress
была выполнена, кнопка (будь то TouchableOpacity
или TouchableHighlight
) теряет свой эффект.
Я не уверен, почему это работает сейчас. Очевидная причина состоит в том, что перекомпиляция исходного кода исправляет ошибки - но я перекомпилировал его для написания исходного вопроса несколько раз, так что это не может быть вариантом. Другим пользователям я бы посоветовал очистить любой возможный кеш, и особенно делать следующие шаги:
- Закройте и снова откройте эмулятор Android / перезапустите тестирующее устройство
- Перезагрузите сборку ПК
- Перекомпилируйте весь исходный код
- Проверьте в своей консоли на наличие ошибок и / или исключений (очевидно)
- замещать
TouchableHighlight
сTouchableOpacity
, перекомпилируйте, проверьте, если ошибка все еще существует - и если нет, повторно обменTouchableOpacity
вTouchableHighlight
Вы можете заменить Touchable Highlight на Touchable opacity и просто установить для свойства activeOpactity значение 1. Оно не будет выделять печать.
<TouchableOpacity activeOpacity={1}>....</TouchableOpacity>
Вы можете заменить Touchable Highlight на Touchable opacity. Это не выделит прессу.
return <TouchableOpacity
onPress={handlePress}>
<Text>Some Text</Text>
</TouchableOpacity >;
Для меня, мне нужно было отключить эффект подсветки после запуска onLongPress. Вы можете просто поменять клавишу сенсорного с помощью повторного рендеринга, когда вы хотите удалить его.
Вот пример:
<TouchableHighLight
onPress={this.pressRow}
style={styles.outerContainer}
onLongPress={() => this.setState({ onLongPressed: true })}
onPressOut={() => this.setState({ onLongPressed: false })}
key={`long-pressed-${this.state.onLongPressed ? 'yes' : 'no'}`}>
<View style={styles.innerContainer}>
{rowText}
{rowIcon}
</View>
</TouchableHighLight>
Следуя ответу Леонардо Лусоли, вам также следует добавить одну вещь:
useEffect(() => {
if(isLongPressed){
setIsLongPressed(false)
}
}, [isLongPressed])
Этот шаг необходим, потому что, когда запускается первое событие onLongPress, оно устанавливает isLongPressed в значение true и, таким образом, изменяя ключ, компонент повторно отображается и идентифицируется как новый компонент, а предыдущие списки событий отбрасываются, поэтому onPressOut не будет запущен. Так
когда для isLongPressed установлено значение true, компонент выполняет повторный рендеринг, а затем мы сразу же устанавливаем для него значение false и, таким образом, получаем ожидаемое поведение. В противном случае мы получим неожиданное поведение, за которым последует одно ожидаемое поведение.