为React Native防止硬件后退按钮android

Nee*_*awa 32 android react-native

我想阻止用户返回上一个屏幕.所以我添加了代码,但这不起作用.这有什么解决方案吗?可以看到警报弹出,但"返回false"不起作用.

componentDidMount() {
   BackAndroid.addEventListener('hardwareBackPress', () => {
     Alert.alert("alert","alert")

      this.props.navigator.pop();

       return false;
   });
Run Code Online (Sandbox Code Playgroud)

Jic*_*son 86

如果要禁用默认的后退按钮行为,则需要返回true.

这是一个示例组件,它将阻止用户返回上一个屏幕.

import React, {Component,} from 'react';
import {
    View,
    Text,
    BackHandler,
    ToastAndroid,
} from 'react-native';

class BackButtonDemo extends Component {
    componentDidMount() {
        BackHandler.addEventListener('hardwareBackPress', this.handleBackButton);
    }

    componentWillUnmount() {
        BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton);
    }

    handleBackButton() {
        ToastAndroid.show('Back button is pressed', ToastAndroid.SHORT);
        return true;
    }

    render() {
        return (
            <View>
                <Text>Back button example</Text>
            </View>
        );
    }
}

module.exports = BackButtonDemo;
Run Code Online (Sandbox Code Playgroud)

注意:

this.props.navigator.pop();从您的解决方案中删除.

Navigatorpop功能会将用户带到之前呈现的屏幕Navigator.

  • 现在不推荐使用BackAndroid。您应该使用BackHandler。它使用相同的事件侦听器方法,因此其变化不大。 (3认同)
  • `return true` 是关键 (2认同)

Ram*_*ino 26

使用react hooks 的闪亮新实现:

import React, {Component, useEffect} from 'react';
import {
    View,
    Text,
    BackHandler,
} from 'react-native';

const LogInView = () => {

    useEffect(() => {
      BackHandler.addEventListener('hardwareBackPress', () => true)
      return () =>
        BackHandler.removeEventListener('hardwareBackPress', () => true)
    }, [])

    return (
        <View>
            <Text>Back button example</Text>
        </View>
    );
}

export default LoginView
Run Code Online (Sandbox Code Playgroud)

  • 第一个 `() =&gt; true` 和第二个 `() =&gt; true` 没有相同的引用。因此,实际上您永远不会删除添加的事件侦听器。 (4认同)

小智 13

我通过在App.js中添加此代码来禁用整个应用程序的后退按钮(android)

componentDidMount() {
  BackAndroid.addEventListener('hardwareBackPress', this.handleBackButton);
}

componentWillUnmount() {
  BackAndroid.removeEventListener('hardwareBackPress', this.handleBackButton);
}

handleBackButton() {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

别忘了导入BackAndroid

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

  • 谢谢!这工作但我得到警告信息,然后我在你的答案上使用"BackHandler"而不是"BackAndroid".然后工作正常,没有任何警告. (2认同)

小智 7

因此,当每个人都在使用React-Native的 Backhandler 时,我尝试使用React-navigation来防止返回处理程序。这对我有用。如果您只是想防止返回而不向用户显示或提醒任何内容。

React.useEffect(() => {
        navigation.addListener('beforeRemove', (e) => {
            e.preventDefault();
        });
    }, [navigation]);
Run Code Online (Sandbox Code Playgroud)

您可以将此代码放入您的功能组件中。

使用案例:

在用户注册中,当用户注册并转到代码确认屏幕时,我们不希望他回来,您现在可以使用此代码。


小智 5

如果您使用反应定型,则需要使用BackHandler而不是BackAndroid

import { BackHandler } from 'react-native';

// code

componentDidMount() {
  BackHandler.addEventListener('backPress');
}

// some more code

componentWillUnmount() {
  BackHandler.removeEventListener('backPress');
}
Run Code Online (Sandbox Code Playgroud)


kha*_*hul 5

通过返回true尝试此禁用后退按钮

import {BackAndroid} from 'react-native';

componentWillMount() {
   BackAndroid.addEventListener('hardwareBackPress', () => {return true});
} 
Run Code Online (Sandbox Code Playgroud)


elü*_*elü 5

只是为了在使用react-navigation时给你一个完整的答案:

如果您使用的是 react-navigation,请将以下内容放在您的RootNavigation 类中,而不是 App.js 中,以禁用整个应用程序的后退按钮。

import { BackHandler } from 'react-native';

componentDidMount() {
    BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressed);
}

componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.onBackButtonPressed);
}

onBackButtonPressed() {
    return true;
}
Run Code Online (Sandbox Code Playgroud)


Osa*_*maD 5

using the BackHandler from react native worked for me. Just include this line in your ComponentWillMount:

BackHandler.addEventListener('hardwareBackPress', function() {return true})
Run Code Online (Sandbox Code Playgroud)

it will disable back button on android device.


小智 -4

硬件后退按钮 OnClick OnBackPressed 回调被调用

您可以在 onBackPressed 回调中删除 super 声明。

 @Override
    public void onBackPressed() {

    }
Run Code Online (Sandbox Code Playgroud)

  • 那是android java代码,这是一个react native问题。 (3认同)