反应原生TouchableOpacity onPress在Android上不起作用

时间:2018-11-29 22:10:34

标签: 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>
);

19 个答案:

答案 0 :(得分:5)

对我来说,它正在工作,但是可触摸的区域很小。在某种程度上,iOS中的区域大于Android中的区域。

我最终使用hitSlop属性增加了可触摸区域,如下所示:

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

答案 1 :(得分:4)

终止城域服务器(如果正在运行),然后再次运行(如下面所示),对我来说都是有效的。

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

使用

终止它

ctrl + c

然后在另一个控制台上,使用

运行您的应用

react-native run-android

npx react-native run-android

答案 2 :(得分:3)

遇到同样的问题。检查您的设备时间是否与所连接的机器相同。在我的情况下,相差1分钟,导致每个TouchableOpacity无法正常工作。

答案 3 :(得分:2)

对我来说,我正在使用NativeBase并具有以下结构,该结构在Android上已中断:

<List>
    <TouchableOpacity>
       <ListItem>
          <Text>Button</Text>
       </ListItem>
    </TouchableOpacity>
</List>

一旦我删除了ListItem,并将文本设为TouchableOpacity的直接子代,那么它就起作用了。

答案 4 :(得分:2)

将图标包装在这样的视图中。

const initDrawer = navigation => (
  <TouchableOpacity
    style={{ left: 16 }}
    onPress={() => onPressDrawerButton(navigation)}
  >
    <View style={{padding:5}}>
        <Ionicons name="ios-menu" color="white" size={30} />
    </View>
  </TouchableOpacity>
);

然后,如果问题仍然存在,请使用backgroundColor设置图标样式,然后您会看到一半的图标未使用backgroundColor设置样式,因此必须给填充物更大的填充量。我不知道,但是图标在音量方面往往会有问题,尤其是在TouchableOpacity中。 这就是为什么我自己使用带有图标填充的父视图。 其他人还提到的另一件事是位置:“绝对”道具,它与Component体积混淆。

答案 5 :(得分:2)

在某些情况下,本机调试器无法在iOS和Android平台上正常运行,我发现TouchableOpacity在启用了调试器的Android上存在触摸错误。尝试禁用此功能,构建后即可正常使用!

答案 6 :(得分:2)

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

答案 7 :(得分:2)

检查您要从中导入可触摸不透明度的库。从“react-native”导入。不是来自“react-native-gesture-handler”

使用这个

import { TouchableOpacity } from 'react-native';

代替这个

import { TouchableOpacity } from 'react-native-gesture-handler';

答案 8 :(得分:1)

我忘了按照react-native-gesture-handler的Android入门步骤进行操作:

https://docs.swmansion.com/react-native-gesture-handler/docs/#android

答案 9 :(得分:1)

我的问题未在此处列出,因此想添加它。

在Android上,如果您在KeyboardAvoidingView内部具有TouchableOpacity,则它将不起作用(至少使用我使用的设置)。

一旦我将KeyboardAvoidingView的范围设置为仅在输入字段周围,而不是在我的TouchableOpacities周围,它便再次开始工作。

(IOS btw很好)

答案 10 :(得分:1)

有同样的问题 - 在我的例子中,它是在 TouchableOpacity 内呈现的一个元素,带有 position: 'absolute' 并且与 TouchableOpacity 成正比,我已经将 zIndex: 0 添加到这个元素让它发挥作用。

答案 11 :(得分:1)

对我来说,从所有父工作中删除“flex:1”。

答案 12 :(得分:1)


<TouchableOpacity
       style={{backgroundColor: 'red', width: 50, height: 50, zIndex: 1}}
       onPress={() => alert('working')}>
       <Text>tset</Text>
 </TouchableOpacity>

zIndex:1 像魔术一样工作。

答案 13 :(得分:0)

如果这对任何人有帮助,

旧代码

<TouchableOpacity onPress={()=>{callback()}} >
   <View style={styles.action}>
      <MaterialCommunityIcons name="close-thick" size={25} color={colors.white} style={styles.icon}/>
   </View>
</TouchableOpacity>

修复

<TouchableOpacity onPress={()=>{callback()}} style={styles.action}>
   <View style={{flex:1}}>
      <MaterialCommunityIcons name="close-thick" size={25} color={colors.white} style={styles.icon}/>
   </View>
</TouchableOpacity>

就我在 android 上的情况而言,TouchableOpacity 从其中的视图(具有绝对位置)呈现(这是预期的,因为位置不是绝对的)。将 borderWidth 和 borderColor 添加到 TouchableOpacity 表明它是在远离视图的地方渲染的。将样式从子视图切换到 TouchableOpacity 解决了该问题。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

检查长按 Touchable 是否有效。就我而言,我在 Android 手机上进行测试,渲染多个 TouchableOpacity 会降低手机速度,如果我触摸组件太短,它就不会注册为有效新闻。

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

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

答案 16 :(得分:0)

如果您使用绝对位置。使用 zIndex 为 TouchableOpacity 注册点击次数

touchableOpacity: {
alignItems: 'center',
justifyContent: 'center',
width: 30,
height: 25,
zIndex: 1,
position: 'absolute',
left: 5},

答案 17 :(得分:0)

尽管以下问题是由React Native的最新版本引起的,但我认为这可能是最近解决此问题的人们的一个解决方法。

这可能是由于使用 debug模式时设备上的时间与开发计算机上的时间不匹配引起的。我通过打开和关闭设备的自动时间设置来解决此问题,该设置“重新提取”了导致其与开发机同步的时间。

此问题与此相关:

https://github.com/facebook/react-native/issues/27008

答案 18 :(得分:0)

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

相关问题