React Native之Android Tabbar的实现.

React是Facebook开源出来的一套前段框架,据目测是目前最热门的一套框架,随之而来是(RN)React Native,这套框架的意义重大,颠覆的不仅仅是移动开发者,连整个应用市场都会受到影响的,所以身为移动的开发者,快速学习起来吧,跟随市场的前沿.

接下来讲解的是Android中如何实现TabBar,都知道RN中针对iOS有TabBarIOS组件而针对安卓并没有类似的组件,因为是从安卓原生转过来的,所以能力有限,只能借助高手来实现自己的功能模块.

一个不错的跨平台开源模块:https://github.com/exponentjs/react-native-tab-navigator

接下来我来简单说明如何应用,首先进入到项目的根目录引入开源支持包:

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

使用简介:

<TabNavigator>  
  <TabNavigator.Item  
    selected={this.state.selectedTab === 'home'}  
    title="Home"  
    renderIcon={() => <Image source={...} />}  
    renderSelectedIcon={() => <Image source={...} />}  
    badgeText="1"  
    onPress={() => this.setState({ selectedTab: 'home' })}>  
    {homeView}  
  </TabNavigator.Item>  
  <TabNavigator.Item  
    selected={this.state.selectedTab === 'profile'}  
    title="Profile"  
    renderIcon={() => <Image source={...} />}  
    renderSelectedIcon={() => <Image source={...} />}  
    renderBadge={() => <CustomBadgeView />}  
    onPress={() => this.setState({ selectedTab: 'profile' })}>  
    {profileView}  
  </TabNavigator.Item>  
</TabNavigator>  

通过使用简介我们可以了解该组件如何使用,但是复杂的UI操作就得需要查看源码了解究竟了,比如:我们要如何修改TabNavigator.Item的title样式和badgeText的样式.
源码如下:

export default class TabNavigatorItem extends React.Component {  
  static propTypes = {  
    renderIcon: PropTypes.func,  
    renderSelectedIcon: PropTypes.func,  
    badgeText: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),  
    renderBadge: PropTypes.func,  
    title: PropTypes.string,  
    titleStyle: Text.propTypes.style,  
    selectedTitleStyle: Text.propTypes.style,  
    tabStyle: View.propTypes.style,  
    selected: PropTypes.bool,  
    onPress: PropTypes.func,  
    allowFontScaling: PropTypes.bool,  
  };  

可以看出renderIcon和renderSelectedIcon对应的PropTypes.func方法,个人感觉这么做非常好,可自定义性非常大,
selectedTitleStyle字面意思可以看出是选中文字的样式,而renderBadge对应的是渲染Badge的方法.
比如:

<TabNavigator.Item  
      title='头条'  
      renderIcon={()=><Image style={styles.tabIcon} source={TAB_NORMAL_1}/>}  
      renderSelectedIcon={()=><Image style={styles.tabIcon} source={TAB_PRESS_1}/>}  
      selected={this.state.selectedTab==='Home'}  
      selectedTitleStyle={{color:'#f85959'}}  
      onPress={()=>this.onPress('Home')}  
      renderBadge={()=><View style={styles.badgeView}><Text style={styles.badgeText}>15</Text></View>}  
     >  

最后贴下全部代码:

/** 
 * Sample React Native App 
 * https://github.com/facebook/react-native 
 * @flow 
 */  
  
import React, { Component } from 'react';  
import {  
  AppRegistry,  
  StyleSheet,  
  Text,  
  View,  
  Image,  
} from 'react-native';  
  
//引入tabbar支持包  
import TabNavigator from 'react-native-tab-navigator';  
  
const TabNavigatorItem =TabNavigator.Item;  
  
const TAB_NORMAL_1=require('./images/tabbar_1.png');  
const TAB_NORMAL_2=require('./images/tabbar_2.png');  
const TAB_NORMAL_3=require('./images/tabbar_3.png');  
const TAB_NORMAL_4=require('./images/tabbar_4.png');  
  
const TAB_PRESS_1=require('./images/tabbar_1_press.png');  
const TAB_PRESS_2=require('./images/tabbar_2_press.png');  
const TAB_PRESS_3=require('./images/tabbar_3_press.png');  
const TAB_PRESS_4=require('./images/tabbar_4_press.png');  
  
class toutiao extends Component {  
  
  constructor(){  
    super();  
    this.state={  
      selectedTab:'Home',  
    }  
  }  
  
  /** 
  tab点击方法 
  **/  
  onPress(tabName){  
    if(tabName){  
      this.setState(  
        {  
          selectedTab:tabName,  
        }  
      );  
    }  
  }  
   /** 
   渲染每项 
   **/  
   renderTabView(title,tabName,tabContent,isBadge){  
     var tabNomal;  
     var tabPress;  
     switch (tabName) {  
       case 'Home':  
         tabNomal=TAB_NORMAL_1;  
         tabPress=TAB_PRESS_1;  
         break;  
     case 'Video':  
       tabNomal=TAB_NORMAL_2;  
       tabPress=TAB_PRESS_2;  
       break;  
     case 'Follow':  
       tabNomal=TAB_NORMAL_3;  
       tabPress=TAB_PRESS_3;  
       break;  
     case 'Mine':  
       tabNomal=TAB_NORMAL_4;  
       tabPress=TAB_PRESS_4;  
       break;  
       default:  
  
     }  
     return(  
       <TabNavigatorItem  
        title={title}  
        renderIcon={()=><Image style={styles.tabIcon} source={tabNomal}/>}  
        renderSelectedIcon={()=><Image style={styles.tabIcon} source={tabPress}/>}  
        selected={this.state.selectedTab===tabName}  
        selectedTitleStyle={{color:'#f85959'}}  
        onPress={()=>this.onPress(tabName)}  
        renderBadge={()=>isBadge?<View style={styles.badgeView}><Text style={styles.badgeText}>15</Text></View>:null}  
       >  
       <View style={{flex:1,justifyContent:'center',alignItems:'center'}}><Text>{tabContent}</Text></View>  
       </TabNavigatorItem>  
     );  
   }  
  
   /** 
   自定义tabbar 
   **/  
  tabBarView(){  
    return (  
      <TabNavigator  
       tabBarStyle={styles.tab}  
      >  
      {this.renderTabView('头条','Home','头条板块',true)}  
      {this.renderTabView('视频','Video','视频板块',false)}  
      {this.renderTabView('关注','Follow','关注板块',false)}  
      {this.renderTabView('我的','Mine','我的板块',false)}  
      </TabNavigator>  
    );  
  }  
  
  
  render() {  
    var tabBarView=this.tabBarView();  
    return (  
      <View style={styles.container}>  
        {tabBarView}  
      </View>  
    );  
  }  
}  
  
const styles = StyleSheet.create({  
  container: {  
    flex: 1,  
    backgroundColor: '#F5FCFF',  
  },  
  welcome: {  
    fontSize: 20,  
    textAlign: 'center',  
    margin: 10,  
  },  
  instructions: {  
    textAlign: 'center',  
    color: '#333333',  
    marginBottom: 5,  
  },  
  tab:{  
    height: 52,  
    alignItems:'center',  
    backgroundColor:'#f4f5f6',  
  },  
  tabIcon:{  
    width:25,  
    height:25,  
  },  
  badgeView:{  
    width:22,  
    height:14 ,  
    backgroundColor:'#f85959',  
    borderWidth:1,  
    marginLeft:10,  
    marginTop:3,  
    borderColor:'#FFF',  
    alignItems:'center',  
    justifyContent:'center',  
    borderRadius:8,  
  },  
  badgeText:{  
    color:'#fff',  
    fontSize:8,  
  }  
});  
  
AppRegistry.registerComponent('toutiao', () => toutiao);  

效果图:可以看到实现了跨平台体验,不过由于设备分辨率不统一所以适配上需要花些时间调整,总之来说还是不错的.

参考:
http://blog.csdn.net/jj120522/article/details/51817903

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容