1. 程式人生 > >【React Native】React Native中DrawerLayoutAndroid通過點選實現展開和關閉

【React Native】React Native中DrawerLayoutAndroid通過點選實現展開和關閉

  React Native中,DrawerLayoutAndroid元件與Android原生開發中的DrawerLayout一樣實現側滑選單的效果。通過手勢左右滑動實現拉出與退出的操作,但是需要通過點選圖示或者文字就能彈出側滑選單該怎麼做呢?

  這時就需要知道DrawerLayoutAndroid在展開和關閉時所呼叫的具體方法了,這個可以通過原始碼知道,點開DrawerLayoutAndroid.android.js的原始碼,發現展開側滑選單的方法是這樣:

 /**
   * Opens the drawer.
   */
  openDrawer: function() {
    UIManager.dispatchViewManagerCommand(
      this
._getDrawerLayoutHandle(), UIManager.AndroidDrawerLayout.Commands.openDrawer, null ); },

同樣也有關閉時的closeDrawer方法。

  所以,在自己的專案中,只需要拿到DrawerLayoutAndroid元件,直接或間接呼叫openDrawer方法即可實現展開。
  
那麼具體的操作就是下面這樣:

1–在DrawerLayoutAndroid中新增ref屬性。

  新增ref屬性即可實現對元件的引用。這裡需要獲取到DrawerLayoutAndroid的引用來呼叫展開關閉的方法。關於ref屬性不熟悉的看這裡—

對元件的引用(refs)
  (這裡對DrawerLayoutAndroid的引用為drawer)

 <DrawerLayoutAndroid
                ref={(drawer) => {
                    this.drawer = drawer;
                }}
                ......

2–定義展開關閉側滑選單的方法。

 根據上面定義的DrawerLayoutAndroid的引用drawer,來呼叫原始碼中openDrawer和closeDrawer方法 。作為自己當前專案展開關閉側滑選單的方法。

 //開啟側滑欄
    onPenLeftDrawer() {
        this.drawer.openDrawer();
    }

    closeLeftDrawer() {
        this.drawer.closeDrawer();
    }

3–onPress將點選與側滑選單的展開和關閉聯絡起來

 定義用於點選展開的按鈕TouchableHighlight,其中的onPress點選函式就是呼叫自己定義的側滑選單的展開方函式。於是,當TouchableHighlight被點選時,呼叫onPenLeftDrawer展開方法。使側滑選單展開。

<TouchableHighlight
      underlayColor="rgb(210, 230, 255)"
      activeOpacity={0.5}
      style={styles.touchable}
      onPress={() => this.onPenLeftDrawer()}
      //onPress={this.onPenLeftDrawer.bind(this)}
 >
    <Text style={{fontSize: 16, justifyContent: 'center'}}>點選我彈出</Text>
</TouchableHighlight>

 由於展開側滑選單之後,手勢操作或者點選側滑選單之外的部分也能使其關閉,所以通過點選使其關閉意義並不大。但是實現方式與上面一樣,在側滑選單的View中,新增點選控制元件,繫結closeLeftDrawer關閉方法,就可以用通過點選來關閉。


最終效果:

這裡寫圖片描述

  
以上效果完整程式碼(專案名Test13):

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, {Component} from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    PixelRatio,
    DrawerLayoutAndroid,
    TouchableHighlight,
} from 'react-native';

class Test13 extends Component {

    //開啟側滑欄
    onPenLeftDrawer() {
        this.drawer.openDrawer();
    }

    closeLeftDrawer() {
        this.drawer.closeDrawer();
    }

    render() {
        var navigationView = (
            <View style={{flex: 1, backgroundColor: 'white'}}>
                <Text style={{margin: 10, color: '#333', fontSize: 15, textAlign: 'center'}}>側滑選單</Text>
                <Text
                    style={{marginTop: 10, marginLeft: 20, color: '#666', fontSize: 15, textAlign: 'left'}}>賬戶設定</Text>
                <Text
                    style={{marginTop: 10, marginLeft: 20, color: '#666', fontSize: 15, textAlign: 'left'}}>支付中心</Text>
                <TouchableHighlight
                    underlayColor="rgb(210, 230, 255)"
                    activeOpacity={0.5}
                    style={[styles.touchable,{marginTop: 280}]}
                    onPress={this.closeLeftDrawer.bind(this)}
                >
                    <Text style={{fontSize: 16, justifyContent: 'center'}}>點選關閉側滑選單</Text>
                </TouchableHighlight>


            </View>
        );
        return (
            <DrawerLayoutAndroid
                ref={(drawer) => {
                    this.drawer = drawer;
                }}
                drawerWidth={250}
                drawerPosition={DrawerLayoutAndroid.positions.Left}
                renderNavigationView={() => navigationView}>
                <View style={{flex: 1,}}>
                    <TouchableHighlight
                        underlayColor="rgb(210, 230, 255)"
                        activeOpacity={0.5}
                        style={styles.touchable}
                        onPress={() => this.onPenLeftDrawer()}
                        //onPress={this.onPenLeftDrawer.bind(this)}
                    >
                        <Text style={{fontSize: 16, justifyContent: 'center'}}>點選我彈出</Text>
                    </TouchableHighlight>
                </View>
            </DrawerLayoutAndroid>
        );
    }
}

const styles = StyleSheet.create({
    button: {
        backgroundColor: 'white',
        padding: 15,
        borderBottomWidth: StyleSheet.hairlineWidth,
        borderBottomColor: '#CDCDCD',
    },
    touchable: {
        backgroundColor: '#fff',
        padding: 15,
        borderBottomWidth: StyleSheet.hairlineWidth,
        borderBottomColor: '#CDCDCD',
    }
});

AppRegistry.registerComponent('Test13', () => Test13);