React Native (二):StatusBar 、 NavigationBar 與 TabBar

React Native (一):基礎(chǔ)
React Native (二):StatusBar 公罕、 NavigationBar 與 TabBar
React Native (三):自定義視圖
React Native (四):加載新聞列表
React Native (五):上下拉刷新加載
React Native (六):加載所有分類與詳情頁

項目地址

React Native App 的視圖結(jié)構(gòu)

首先把 setup.jsRoot 以及 布局 的代碼改一下:

class Root extends React.Component {
    render() {
        return (
            <View style={styles.container}>
                    
            </View>
        );
    }
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: 'white',
    },

});

React Native 的所有界面都是在一個主視圖上制圈,這里的這個 <View>iOS 中的 Window 是同樣的邓尤,這里跟 Android 不太一樣。

當(dāng)然運行在 iOSAndroid 中還是以 ViewControllerActivity 展示的剩檀。

StatusBar

iOSAndroidStatusBar 是差不多的憋沿,都是頂部那高度 20 的部分,用來顯示信號沪猴、電量等系統(tǒng)的信息辐啄。

setup.js 中加入 StatusBar

import {
    StyleSheet,
    Text,
    View,
    StatusBar
} from 'react-native';

class Root extends React.Component {
    render() {
        return (
            <View style={styles.container}>
                <StatusBar 
                    barStyle={'light-content'}
                    backgroundColor={'#000000'}
                />
            </View>
        );
    }
}

StatusBar 的配置可以看這里,注意有些屬性只針對特定平臺运嗜。

這樣可以設(shè)置整個 AppStatusBar 的樣式壶辜,如果有某個頁面 AStatusBar 需要特殊處理,那么就在 A 頁面加入 StatusBar 進(jìn)行設(shè)置担租。

Navigator

我們需要用 Navigator 來讓整個 App 可以在頁面之間跳轉(zhuǎn)砸民。

NavigatoriOS 的一樣,都是對頁面進(jìn)行 pushpop 翩活,跟 AndroidNavigationView 不是一個東西阱洪。

官方文檔在這里

現(xiàn)在在 App 文件夾內(nèi)創(chuàng)建一個新的文件 App.js

'use strict';


import React from 'react'

import {
    StyleSheet,
    View,
    Text

} from 'react-native';

export default class App extends React.Component {

    render() {
        return (
            <View style={styles.view}>
        <Text>main</Text>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    view: {
        flex: 1,
        backgroundColor: 'white',
        alignItems: 'center',
        justifyContent: 'center'

    },
});


然后在 setup 內(nèi) StatusBar 下面加入 Navigator :

import App from './App'


<Navigator
    initialRoute={{ component: App }}

    style={{flex:1}}
    renderScene={(route, navigator) => {
        BackAndroid.addEventListener('hardwareBackPress', function() {
            if(navigator == null){
                return false;
            }
            if(navigator.getCurrentRoutes().length === 1){
                return false;
            }
            navigator.pop();
            return true;
        });

        let Component = route.component;
        return <Component {...route.params} navigator={navigator}/>
        //  上面的route.params 是為了方便后續(xù)界面間傳遞參數(shù)用的
    }}
/>

其中 initialRoute 設(shè)置了 component ,是最底層的第一個頁面菠镇。

然后 renderScene 控制 push 的時候做哪些操作冗荸,這里的 BackAndroid.addEventListener 是監(jiān)聽了 Android 的物理返回按鍵。

現(xiàn)在運行可以看見頁面中間有個 main

你可能會發(fā)現(xiàn)為什么沒 NavigationBar 呢利耍,我們后面再加蚌本。

tab-navigator

官方并沒有 TabBar ,我們使用一個第三方 react-native-tab-navigator

在項目根目錄執(zhí)行命令

npm install react-native-tab-navigator --save

安裝完成后在 App.js 加入 TabNavigator:


const home_key = 'home'
const satin_key = 'satin'
const setting_key = 'setting'


import Home from './Home/Home'
import Satin from './Satin/Satin'
import Setting from './Setting/Setting'


<TabNavigator>
    <TabNavigator.Item
        selected={this.state.selectedTab === home_key}
        title="首頁"
        titleStyle={styles.tabText}
        selectedTitleStyle={styles.selectedTabText}
        renderIcon={() => <Image style={styles.icon} source={require("./Images/root/home_unselect.png")} />}
        renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/home_select.png")} />}
        onPress={() => this.setState({ selectedTab: home_key })}>
    
        <Home navigator={this.props.navigator}/>
    </TabNavigator.Item>
    <TabNavigator.Item
        selected={this.state.selectedTab === satin_key}
        title="段子"
        titleStyle={styles.tabText}
        selectedTitleStyle={styles.selectedTabText}
        renderIcon={() => <Image style={styles.icon} source={require("./Images/root/activity_unselect.png")} />}
        renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/activity_select.png")} />}
        onPress={() => this.setState({ selectedTab: satin_key })}>
    
        <Satin navigator={this.props.navigator}/>
    </TabNavigator.Item>
    <TabNavigator.Item
        selected={this.state.selectedTab === setting_key}
        title="我的"
        titleStyle={styles.tabText}
        selectedTitleStyle={styles.selectedTabText}
        renderIcon={() => <Image style={styles.icon} source={require("./Images/root/my_unselect.png")} />}
        renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/my_select.png")} />}
        onPress={() => this.setState({ selectedTab: setting_key })}>
    
        <Setting navigator={this.props.navigator}/>
    </TabNavigator.Item>
</TabNavigator>

配置也比較易懂隘梨。

另外創(chuàng)建 3 個文件 Home.js 程癌、 Satin.jsSetting.js

import React from 'react'

import {
    View,
    StyleSheet
} from 'react-native'


export default class Satin extends React.Component {
    render() {
        return (
            <View style={styles.view}>

            </View>
        )
    }
}

const styles = StyleSheet.create({
    view: {
        flex:1,
        backgroundColor: 'orange'
    }
})

可以給每個設(shè)置不同的顏色,這樣點擊界面切換也很明顯轴猎。

具體的代碼可以看 項目

NavigationBar

同意官方也沒有提供 NavigationBar嵌莉,我們需要自定義一個。

然后在 Home.js 捻脖、 Satin.jsSetting.js 加入



import React from 'react'

import {
    View,
    StyleSheet
} from 'react-native'

import NavigationBar from '../Custom/NavBarCommon'


export default class Home extends React.Component {
    render() {
        return (
            <View style={styles.view}>
                <NavigationBar
                    title="首頁"
                    unLeftImage={true}
                />

            </View>
        )
    }
}

const styles = StyleSheet.create({
    view: {
        flex:1,
        backgroundColor: 'white'
    }
})

navibar
navibar

項目地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐峭,一起剝皮案震驚了整個濱河市中鼠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沿癞,老刑警劉巖援雇,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異椎扬,居然都是意外死亡惫搏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蚕涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筐赔,“玉大人,你說我怎么就攤上這事钻趋〈剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵蛮位,是天一觀的道長较沪。 經(jīng)常有香客問我,道長失仁,這世上最難降的妖魔是什么尸曼? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮萄焦,結(jié)果婚禮上控轿,老公的妹妹穿的比我還像新娘。我一直安慰自己拂封,他們只是感情好茬射,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冒签,像睡著了一般在抛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萧恕,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天刚梭,我揣著相機(jī)與錄音,去河邊找鬼票唆。 笑死朴读,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的走趋。 我是一名探鬼主播衅金,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氮唯?” 一聲冷哼從身側(cè)響起酥宴,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎您觉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體授滓,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡琳水,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了般堆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在孝。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淮摔,靈堂內(nèi)的尸體忽然破棺而出私沮,到底是詐尸還是另有隱情,我是刑警寧澤和橙,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布仔燕,位于F島的核電站,受9級特大地震影響魔招,放射性物質(zhì)發(fā)生泄漏晰搀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一办斑、第九天 我趴在偏房一處隱蔽的房頂上張望外恕。 院中可真熱鬧,春花似錦乡翅、人聲如沸鳞疲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尚洽。三九已至,卻和暖如春波势,著一層夾襖步出監(jiān)牢的瞬間翎朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工尺铣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拴曲,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓凛忿,卻偏偏與公主長得像澈灼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容