【问题标题】:RTL and LTR Drawer Navigation switching between them depending on user languageRTL 和 LTR 抽屉导航根据用户语言在它们之间切换
【发布时间】:2018-07-02 13:10:27
【问题描述】:

如何添加从 RTL 更改为 ltr 的抽屉动态抽屉导航,反之亦然。 登录后进入主页面,抽屉可以打开,但它的位置取决于用户登录时选择的语言

app.js

import React from 'react';
    import TeaApp from './Pages/navigation';


    export default class App extends React.Component {
      constructor(){
        super();
        this.state = {
          name : '',
        };

      }

      render() {
        return (

            <TeaApp/>

        );
      }
    }

导航

            import React,{ Component } from 'react';
            import { AsyncStorage, View, Text, Image, StyleSheet, Button, SafeAreaView} from 'react-native';
            import { StackNavigator , SwitchNavigator, DrawerNavigator, DrawerItems,TouchableOpacity} from 'react-navigation';
            import Login from './login';
            import Mainpage from './mainPage';
            import Menu from './menu';
            import CustomizeOrder from './customizeOrder';
            import Intro from './intro';
            import PreviewOrder from './previewOrder';
            import ViewOrder from './viewOrder';

            const INTRO = StackNavigator({ Intro:{screen: Intro} });
            const LOGIN = StackNavigator({ Login:{screen: Login} });

            const REST = StackNavigator({ 
                UserHome:{screen: Mainpage,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})},
                Menu:{screen: Menu,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})},
                customizeOrder:{screen: CustomizeOrder,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})},
                previewOrder:{screen: PreviewOrder,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})}, 
                viewOrder:{screen: ViewOrder,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})}, 

            });


            const DrawerUserAR = DrawerNavigator(
                {
                    الصفحة_الرئيسية :{screen: REST,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})},
                    المطبخ :{screen: KitchenPage},
                    الطلبات:{screen: VIEWORDER},
                    تغيير_كلمة_المرور:{screen: ChangePassword},
                    تغيير_اللغة: {screen: ChangeLanguage}
                    //logout:{}
                },
                {
                    initialRouteName: 'الصفحة_الرئيسية',
                    drawerPosition: 'right',
                    contentComponent:(props) => (
                        <View style={{flex:1}}>
                            <Image
                                style={styles.drawerImage}
                                source={{uri:props.descriptors.الصفحة_الرئيسية.navigation.state.routes[0].params.content.company_logo_small}} />
                            <Text/>
                            <Text style={{textAlign:'center',fontSize:15,marginVertical:15}}>{props.descriptors.الصفحة_الرئيسية.navigation.state.routes[0].params.content.name}</Text>
                            <Text/>
                            <DrawerItems {...props} />
                            <Text/><Text/>
                            <Text/><Text/>
                            <Text/><Text/>
                            <Text/><Text/>
                            <Text/><Text/>
                        </View>),
                    drawerOpenRoute: 'DrawerOpen',
                    drawerCloseRoute: 'DrawerClose',
                    drawerToggleRoute: 'DrawerToggle'
                }
            );

            const DrawerUserEN = DrawerNavigator(
                {
                    Mainpage :{screen: REST,navigationOptions:({navigation})=>({drawerLockMode:"locked-closed"})},
                    Kitchen :{screen: KitchenPage},
                    viewOrder:{screen: VIEWORDER},
                    changePassword:{screen: ChangePassword},
                    changeLanguage: {screen: ChangeLanguage}
                    //logout:{}
                },
                {
                    initialRouteName: 'Mainpage',
                    drawerPosition: 'left',
                    contentComponent:(props) => 
                        (
                        <View style={{flex:1}}>
                            <Image
                                style={styles.drawerImage}
                                source={{uri:props.descriptors.Mainpage.navigation.state.routes[0].params.content.company_logo_small}} />
                            <Text/>
                            <Text style={{textAlign:'center',fontSize:15,marginVertical:15}}>{props.descriptors.Mainpage.navigation.state.routes[0].params.content.name}</Text>
                            <Text/>
                            <DrawerItems {...props} />
                            <Text/><Text/>
                            <Text/><Text/>
                            <Text/><Text/>

                        </View>),
                    drawerOpenRoute: 'DrawerOpen',
                    drawerCloseRoute: 'DrawerClose',
                    drawerToggleRoute: 'DrawerToggle'
                }
            );

            export default SwitchNavigator(
                {
                    intro:{screen: INTRO},
                    login:{screen: LOGIN},
                    rest:{screen: REST},
                    rest:{screen: /*drawer depending on the language that will get it from login*/},
                },
                {
                    initialRouteName: 'intro'
                }
            );


            const styles = StyleSheet.create({

                container: {
                flex: 1,
                justifyContent: 'center',
                alignItems: 'center'
                },
                drawerHeader: {
                height: 200,
                backgroundColor: 'white'
                },
                drawerImage: {
                marginTop: 20,
                height: 150,
                width: 150,
                borderRadius: 75,
                alignSelf:'center'
                }

            })

________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ________________________________________________________________________________________________________________________________________________________________

【问题讨论】:

  • 请使用代码显示您当前的设置以及您迄今为止研究和尝试的内容
  • github.com/react-navigation/react-navigation/issues/3504 - brentvatne(开发人员之一)说你不能这样做(这是在二月份)。我能想到的唯一选择是制作两个抽屉 - 一个用于左侧,一个用于右侧,并根据您的需要导航到合适的抽屉。

标签: react-native react-router react-redux react-navigation


【解决方案1】:

我通过 I18nManager 解决了这个问题!它工作得很好。我的应用程序中有 2 个按钮,每个按钮都表示一种特定的语言,其中一个是需要应用程序成为 RTL 的波斯语,一个是需要成为 LTR 的英语。每当用户按下这些按钮中的每一个时,都会调用以下函数:

 import {I18nManager} from 'react-native'
 import RNRestart from 'react-native-restart';

 async changeAppLang(lang) {

    if(lang == 'fa') {
        if (!I18nManager.isRTL) {
            await I18nManager.forceRTL(true);
          }
    } else {
        if (I18nManager.isRTL) {
            await I18nManager.forceRTL(false);
          }
    }
    RNRestart.Restart()
}

RNRestart 包用于重启应用程序,您应该使用以下命令安装它:

npm install react-native-restart --save
react-native link react-native-restart

“lang”参数是一个字符串,只要按下其中一个语言按钮,我就会传递给该函数。例如,按下波斯语按钮时传递“fa”,按下英文按钮时传递“en”。所以使用上面的代码,我改变了I18nManager.isRTL 状态。然后我编辑抽屉位置如下:

import {I18nManager} from 'react-native';
const drawer = createDrawerNavigator({
  Main: Main
}, {
     drawerPosition: I18nManager.isRTL ?'right':'left',
     contentComponent: DrawerMenu
})

希望它能帮助任何寻找答案的人。

【讨论】:

  • 你能不能解释一下,我还在等你
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2018-11-26
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多