【问题标题】:Touchablehighlight not clickable if position absolute如果绝对位置,Touchablehighlight 不可点击
【发布时间】:2016-08-24 15:19:52
【问题描述】:

我有一个 Touchablehighlight 需要绝对定位,但在我这样做后它变得无法点击。

是什么原因造成的?如果我没有将位置设置为绝对,它的功能就像它应该的那样。

【问题讨论】:

标签: react-native


【解决方案1】:

我的问题完全不同,我的按钮容器上设置了一个 backgroundColor 样式属性。颜色没用。我错过了删除这个无用的属性。最后,这个 backgroundColor 在我的按钮上方制作了一个不可见的表格。删除它使其再次可点击。

我只在 Android 上遇到过这个问题。

【讨论】:

    【解决方案2】:

    在尝试了两个小时后,我找到的解决方案是改变我的按钮位置。

    之前...

      export default class Navbar extends Component {
    
      componentDidMount() {
        console.log(this.props);
      }
    
      render() {
        return (
          <View style={styles.content}>
            <TouchableOpacity
              onPress={this.props.openModal}
              style={styles.containerButton}
            >
              <Text>New</Text>
            </TouchableOpacity>
            <Text style={styles.textCenter}>Remember me</Text>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      content: {
        paddingTop: 30,
        paddingBottom: 10,
        backgroundColor: '#81C04D',
        flexDirection: 'row'
      },
      containerButton: {
        position: 'absolute',
        top: 30,
        left: 8
      },
      textCenter: {
        flex: 1,
        textAlign: 'center',
        fontWeight: 'bold'
      }
    });
    

    之后……

    export default class Navbar extends Component {
    
      componentDidMount() {
        console.log(this.props);
      }
    
      render() {
        return (
          <View style={styles.content}>
            <Text style={styles.textCenter}>Remember me</Text>
            <TouchableOpacity
              onPress={this.props.openModal}
              style={styles.containerButton}
            >
              <Text>New</Text>
            </TouchableOpacity>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      content: {
        paddingTop: 30,
        paddingBottom: 10,
        backgroundColor: '#81C04D',
        flexDirection: 'row'
      },
      containerButton: {
        position: 'absolute',
        top: 30,
        left: 8
      },
      textCenter: {
        flex: 1,
        textAlign: 'center',
        fontWeight: 'bold'
      }
    });
    

    有效!!!

    【讨论】:

    • 谢谢伙计,在 react native elements 按钮上也为我工作
    • 这行得通!并节省了大量时间!
    【解决方案3】:

    另一种解决方案.....

    对我来说,有效的方法是结合起来......

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

    然后我将 TouchableOpacity 包裹在一个视图中。

    之前:

    <TouchableOpacity onPress={()=> addCallback()}
        style={styles.addButtonHolder}
    > 
        <PlusCircle style={styles.addButton} width={70} height={70} stroke={"white"} strokeWidth={3}/>
    </TouchableOpacity>
    

    之后:

    <View style={styles.addButtonHolder}>
        <TouchableOpacity onPress={()=> addCallback()}> 
            <PlusCircle style={styles.addButton} width={70} height={70} stroke={"white"} strokeWidth={3}/>
        </TouchableOpacity>
    </View>
    

    样式表:

    const styles = StyleSheet.create({
    
        addButtonHolder: {
            position: 'absolute',
            bottom: 70,
            right: 10,
            justifyContent: 'center', 
            alignItems: 'center',
            zIndex: 1,
        },
        addButton: {
            backgroundColor: '#b4cffa',
            borderRadius: 35
        }
    })
    

    【讨论】:

    • 我尝试了这个线程中的所有解决方案,但只有这个对我有帮助
    【解决方案4】:

    对我来说,它的工作原理是:

    从 'react-native' 导入 { TouchableOpacity };

    onPress,zIndex:1,位置:'绝对'

    【讨论】:

      【解决方案5】:

      伙计,我花了很长时间才弄清楚为什么会发生这种情况。 我在这里测试了很多解决方案。有两件事起作用:

      <View style={{  zIndex:0 }>
       ...
       <View style={{ position: 'absulote', zIndex:10 ,elevation: 10 }}>
          <TouchableHighLight><Text>Click me</Text></TouchableHighlight>
       </View>
       <View> .... </View>
       ...
      </View>
      

      如果我是对的,原因是即使显示了按钮,Android 也会以不同的方式处理 Press 事件的层,您需要为其余组件设置低级别。为你的 wrapper 组件定义一个较低的级别,它所有没有这个属性的子组件将自动从父组件继承。

      【讨论】:

        【解决方案6】:

        当位置是绝对位置时,TouchableHighlight 或 TouchableOpacity 会从表面下方。您必须为容器添加更高的 zIndex 值。

        【讨论】:

          【解决方案7】:

          使用 zIndex: 1 在视图中,它会起作用的。

          &lt;View style={{position : 'absolute', marginTop : 25, zIndex: 1}}&gt;

          更多细节可以在这里找到:

          How to use zIndex in react-native

          【讨论】:

          • 你知道这篇文章已经超过 4 年了,并且是在引入 zindex 之前写的吗?
          【解决方案8】:

          此道具有助于禁用 ScrollView 以捕捉所有触摸并让子句柄

           keyboardShouldPersistTaps='always'
          
          • 'always',键盘不会自动关闭,滚动视图不会捕捉点击,但滚动视图的子视图可以捕捉点击。
          • 'handled',当点击被滚动视图的子级处理(或被祖先捕获)时,键盘不会自动关闭。

          https://reactnative.dev/docs/scrollview#keyboardshouldpersisttaps

          【讨论】:

            【解决方案9】:

            这对我有用

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

            并将 onPress 更改为 onPressIn

            <TouchableOpacity onPressIn={() => console.log('clicked')}></TouchableOpacity>
            

            【讨论】:

              【解决方案10】:

              已解决:

              我今天遇到了这个问题。我已经解决了。

              react-native-gesture-handler 导入TouchableOpacity 而不是react-native

              之前

              import {TouchableOpacity} from "react-native";
              

              之后

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

              【讨论】:

              • 这是最好的答案,我一直在努力解决这个问题,并意识到我一直在从 react-native-gesture-handler 导入 TouchableOpacity 并将其更改为从 react-native 导入。是的,它是另一种方式,但是它产生了火花并且起作用了:p
              • import {TouchableOpacity} from 'react-native-gesture-handler' 为我完成了这项工作。谢谢!
              • 这个答案没有任何解释。建议依靠魔法,而不是工程。而“react-native-gesture-handler”也有它的缺点(例如,点击此页面上的链接)
              • 有趣的是,对我来说解决方案正好相反,我从 react-native-gesture-handler 切换回 react-native 的 TouchableHighlight。
              • +1,由于某种原因,我的也反过来工作,zindex/重新排序的答案没有做任何事情。
              【解决方案11】:

              我的解决方案是:

              style:{
                  zIndex: 1,
                  position: 'absolute',
               }
              

              【讨论】:

                【解决方案12】:

                使用 onPressIn 代替 onPress

                这使得该区域可点击!

                【讨论】:

                  【解决方案13】:

                  我在绝对视图中使用了TouchableOpacityonPress 函数按下后没有被调用。但是不透明度发生了变化。我已经尝试了上述所有解决方案,但都没有奏效。

                  我的解决方案是使用onPressIn 而不是onPress

                  在 ReactNative 中,Touchable* 的内部动作在绝对视图中似乎很奇怪。

                  【讨论】:

                    【解决方案14】:

                    Dude 只需将 zIndex : 1 添加到包含按钮和繁荣的视图中,在大多数情况下你都已完成。另请注意,添加高程会为 android 按钮添加阴影,有时如果将高程添加到父级而不添加到子级,则高程也可能是一个问题,那么子按钮可能不起作用。(罕见情况)

                    例如:

                    buttonContainers:
                      {
                        zIndex: 1,
                        alignSelf: 'flex-end',
                        position: 'absolute',
                        top:5,
                        right: 5,
                        height: 40,
                        borderWidth: 1,
                        justifyContent: 'center',
                        alignContent: 'center',
                        width: 80
                      },
                    

                    【讨论】:

                    • 这是一篇很老的帖子,是在 RN 中引入 zIndex 之前发表的。
                    • 对不起兄弟,我刚刚发表了评论,以便如果任何刚接触本机反应的人面临同样的问题并且不知道 zIndex,那么它可以帮助他们很多。 :)
                    • 这刚刚解决了我与react-native-vector-icons 的问题。 zIndex: 1 是一个重要的奖励属性。否则,在 &lt;TouchableOpacity /&gt; 中包含 &lt;Icon /&gt; 组件会导致图标不充当点击空间但图标周围区域充当点击空间的问题,因此它使按钮成为 100% 垃圾酱。
                    • 编辑 1:有时 zIndex 不仅足够,您还必须在 android 的父视图上方为子视图添加高程才能使其工作:)
                    • 这不起作用,我在 reactnavigation 的标题中有一些可触摸的东西。 zIndex 没有帮助。
                    【解决方案15】:

                    解决方案是更改组件的顺序。

                    我最初拥有的:

                    <TouchableHighLight><Text>Click me</Text></TouchableHighlight>
                    <View> .... </View>
                    

                    这是修复:

                    <View>...</View>
                    <TouchableHighLight><Text>Click me</Text></TouchableHighlight>
                    

                    【讨论】:

                    • 如果我是正确的,最后一个元素显示在第一个元素的上方。通常,这就是将元素加载到 DOM 的方式。在这里,因为第一个元素是absolute,所以第二个元素呈现在它上面。当我们更改顺序时,absolute 元素(现在是第二个元素)加载到顶部。
                    • 如果您不想更改组件的顺序,另一种方法是更改​​您想要在所有内容之上的组件的zIndex。在大多数情况下,即使是 zIndex: 1 也会这样做...
                    • 我遇到了这个问题,我的问题是,我的容器必须使用相对位置(子组件是绝对的),所以我不能像这个线程中的答案一样交换组件的代码位置。你有什么建议吗?
                    • 这对于在 FlatList 顶部显示组件是绝对必要的。谢谢。
                    • @HedeH 不确定在哪些用例中您会介意更改组件的顺序,并且必须使用 zIndex。它增加了额外的价值,尽管它是明确的。不幸的是,这意味着您可以将具有绝对定位的组件放在组件中的任何位置。这是不整洁的。
                    猜你喜欢
                    • 1970-01-01
                    • 2012-05-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-10-22
                    • 2019-06-04
                    • 2021-06-11
                    • 1970-01-01
                    • 2019-06-01
                    相关资源
                    最近更新 更多