反应原生 TouchableOpacity onPress 不适用于 Android

use*_*164 25 android react-native touchableopacity touchablehighlight

TouchabelOpacity 在 iOS 上运行良好,但 onPress 方法对我来说在 Android 上不起作用。

我的本机版本:0.57.4

我的代码:

const initDrawer = navigation => (
  <TouchableOpacity
    style={{ left: 16 }}
    onPress={() => onPressDrawerButton(navigation)}
  >
    <Ionicons name="ios-menu" color="white" size={30} />
  </TouchableOpacity>
);
Run Code Online (Sandbox Code Playgroud)

Ali*_*Ali 125

我有类似的问题。注意从哪里导入“TouchableOpacity”。当我将“TouchableOpacity”从“react-native-gesture-handler”更改为“react-native”时,它对我有用(适用于Android平台)

  • 对我来说,当我从react-native切换到react-native-gesture-handler时,它起作用了 (4认同)
  • 应该是答案 (2认同)
  • 这是真正有效的答案 (2认同)
  • 我建议添加 eslint no-restricted-imports 规则,禁止从 react-native-gesture-handler 导入。`'no-restricted-imports': [ 'error', { paths: [ { name: 'react-native-gesture-handler', importNames: ['TouchableOpacity'], message: '从react-native导入TouchableOpacity' , }, ], }, ],` (2认同)

小智 22

我遇到了同样的问题,所有 TouchableOpacity 按钮在 iOS 版本中都可以正常工作,但在 Android 中有一个没有触发。我在这里偶然发现了这个答案,其中提到position: absolute会弄乱触发器。它解决了我的问题。

  • 我以类似的方式解决了我的问题。在层次结构方面,我在可触摸的不透明度中有一个视图;我向视图添加了定位,同时假设可触摸不透明度也会采用其子定位,这就是我的问题所在,点击视图不会执行我的方法,因为可触摸不透明度与它的子级具有不同的定位。我通过在可触摸不透明度而不是视图上进行定位来解决这个问题。希望这对某人有帮助。 (2认同)

tae*_* ha 12

终止Metro 服务器(如果它当前正在运行)然后再次运行它(如下所示)对我有用。


在运行 Metro 服务器的控制台上,终止

ctrl + c

然后在另一个控制台上,运行您的应用程序

react-native run-android

或者

npx react-native run-android


Mat*_*oon 11

检查长时间按 Touchable 是否有效。就我而言,我正在 Android 手机上进行测试,并且多次渲染会TouchableOpacity减慢手机的速度,如果我太短暂地触摸该组件,它就不会注册为有效的按下。

根据官方文档onPress,它会取消无效的按下: https://reactnative.dev/docs/touchablewithoutfeedback#onpress

在这种情况下,您可以使用onPressOutonPressIn代替来onPress确保您的触摸始终有效。


小智 9

TouchableOpacity 默认从“react-native-gesture-handler”包自动导入。该版本在安卓上无法正常运行。


Lov*_*rma 9

我也遇到了同样的问题,我只需将 TouchableOpacity 的导入从“react-native-gesture-handler”更改为“react-native”,就解决了问题。

在此输入图像描述


Mat*_*mán 8

对我来说,它是有效的,但可触摸区域非常小。不知何故,iOS 中的区域比 Android 中更大。

我最终使用以下hitSlop属性增加了可触摸区域:

<TouchableOpacity
    onPress={() => {}}
    hitSlop={{ top: 30, bottom: 30, left: 30, right: 30 }}
>
    <Icon name="eye" />
</TouchableOpacity>
Run Code Online (Sandbox Code Playgroud)


Mor*_*s S 7

使用 Expo SDK 42.0.0 遇到了同样的问题

从 切换onPressonPressIn并有效。

onPressIn={() => {console.log('press!')}


Aay*_*rya 6

在我的情况下,我从“react-native”添加它后从“react-native-gesture-handler”导入了TouchableOpacity,它起作用了


小智 5

Check the library you are importing touchable Opacity from. Import it from "react-native". not from "react-native-gesture-handler"

Use this

import { TouchableOpacity } from 'react-native';
Run Code Online (Sandbox Code Playgroud)

instead of this

import { TouchableOpacity } from 'react-native-gesture-handler';
Run Code Online (Sandbox Code Playgroud)