如何禁用滑动以打开而不是关闭反应本机?
How to disable swipe to open but not for closing in react-native?
我想禁用滑动打开抽屉导航而不是关闭?
我找到了 android 的解决方案,但没有找到 react-native 的解决方案。
目前我正在使用这个:
drawerLockMode: 'locked-open'
有效,但我无法通过滑动关闭它。
我正在打开带有汉堡菜单图标的抽屉,如下所示:
onPress={() => props.navigation.toggleDrawer()}
有人已经这样做了吗?
有没有办法全局设置 drawerLockMode
?
onDrawerOpened
和 onDrawerClosed
道具是否存在?
谢谢!
如果您使用的是 react-navigation,您可以获得在与导航相关的任何内容发生更改时触发的事件。即使是抽屉打开或抽屉关闭事件。 (我现在无法举出一个工作示例。)
有关更多信息,请访问这些链接。
Status of React Navigation drawer? (open or closed)
https://reactnavigation.org/docs/en/drawer-based-navigation.html
尝试获取事件对象信息以检测和覆盖行为。
您需要 react-native-gesture-handler
模块才能 swipe
。
你可以运行
yarn add react-native-gesture-handler
OR
npm install --save react-native-gesture-handler
AND react-native link react-native-gesture-handler
更新您的 MainActivity.java
文件(或您创建 ReactActivityDelegate
实例的任何地方),以便它覆盖负责创建 ReactRootView
实例的方法,然后使用根视图包装器本图书馆提供。不要忘记导入 ReactActivityDelegate
、ReactRootView
和 RNGestureHandlerEnabledRootView
:
package com.swmansion.gesturehandler.react.example;
import com.facebook.react.ReactActivity;
+ import com.facebook.react.ReactActivityDelegate;
+ import com.facebook.react.ReactRootView;
+ import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
public class MainActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
return "Example";
}
+ @Override
+ protected ReactActivityDelegate createReactActivityDelegate() {
+ return new ReactActivityDelegate(this, getMainComponentName()) {
+ @Override
+ protected ReactRootView createRootView() {
+ return new RNGestureHandlerEnabledRootView(MainActivity.this);
+ }
+ };
+ }
}
这是对我有用的解决方案,我认为它简单易行:
import { DrawerNavigator } from "../router/router";
import React, { Component } from "react";
export default class Drawer extends Component {
state = {
lockMode: "locked-closed"
};
render() {
return (
<DrawerNavigator
screenProps={{
drawerLockMode: this.state.lockMode
}}
onNavigationStateChange={(prevState, newState, action) => {
if (
action.type === "Navigation/MARK_DRAWER_SETTLING" &&
!action.willShow
)
this.setState({ lockMode: "locked-closed" });
if (
action.type === "Navigation/MARK_DRAWER_SETTLING" &&
action.willShow
) {
this.setState({ lockMode: "unlocked" });
}
}}
/>
);
}
}
我想禁用滑动打开抽屉导航而不是关闭?
我找到了 android 的解决方案,但没有找到 react-native 的解决方案。 目前我正在使用这个:
drawerLockMode: 'locked-open'
有效,但我无法通过滑动关闭它。
我正在打开带有汉堡菜单图标的抽屉,如下所示:
onPress={() => props.navigation.toggleDrawer()}
有人已经这样做了吗?
有没有办法全局设置 drawerLockMode
?
onDrawerOpened
和 onDrawerClosed
道具是否存在?
谢谢!
如果您使用的是 react-navigation,您可以获得在与导航相关的任何内容发生更改时触发的事件。即使是抽屉打开或抽屉关闭事件。 (我现在无法举出一个工作示例。)
有关更多信息,请访问这些链接。 Status of React Navigation drawer? (open or closed) https://reactnavigation.org/docs/en/drawer-based-navigation.html
尝试获取事件对象信息以检测和覆盖行为。
您需要 react-native-gesture-handler
模块才能 swipe
。
你可以运行
yarn add react-native-gesture-handler
OR
npm install --save react-native-gesture-handler
AND react-native link react-native-gesture-handler
更新您的 MainActivity.java
文件(或您创建 ReactActivityDelegate
实例的任何地方),以便它覆盖负责创建 ReactRootView
实例的方法,然后使用根视图包装器本图书馆提供。不要忘记导入 ReactActivityDelegate
、ReactRootView
和 RNGestureHandlerEnabledRootView
:
package com.swmansion.gesturehandler.react.example;
import com.facebook.react.ReactActivity;
+ import com.facebook.react.ReactActivityDelegate;
+ import com.facebook.react.ReactRootView;
+ import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
public class MainActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
return "Example";
}
+ @Override
+ protected ReactActivityDelegate createReactActivityDelegate() {
+ return new ReactActivityDelegate(this, getMainComponentName()) {
+ @Override
+ protected ReactRootView createRootView() {
+ return new RNGestureHandlerEnabledRootView(MainActivity.this);
+ }
+ };
+ }
}
这是对我有用的解决方案,我认为它简单易行:
import { DrawerNavigator } from "../router/router";
import React, { Component } from "react";
export default class Drawer extends Component {
state = {
lockMode: "locked-closed"
};
render() {
return (
<DrawerNavigator
screenProps={{
drawerLockMode: this.state.lockMode
}}
onNavigationStateChange={(prevState, newState, action) => {
if (
action.type === "Navigation/MARK_DRAWER_SETTLING" &&
!action.willShow
)
this.setState({ lockMode: "locked-closed" });
if (
action.type === "Navigation/MARK_DRAWER_SETTLING" &&
action.willShow
) {
this.setState({ lockMode: "unlocked" });
}
}}
/>
);
}
}