自定义react-navigation的TabBar
在某些情况下,默认的react-navigation的tab bar无法满足开发者的要求。这个时候就需要自定义一个tab bar了。本文就基于react-navigtion v2来演示如何实现一个自定义tab bar。
这里主要处理的是再android里,当界面中有输入框,唤起软键盘的时候位于底部的tab bar也会浮动到键盘的上方。这显然不是我们需要的。所以,需要用自定义的tab bar来解决这个问题。
Keyboard模块
问题是,有键盘的时候tabbar会被顶起来,键盘消失的时候tab bar也会恢复到正常的位置。
那么处理这个问题的最好办法就是,当键盘唤起的时候让tab bar不可见,当键盘消失当时候再让tab bar显示出来。
这就需要用到Keyboard了。
import { Keyboard } from 'react-native';
Keyboard模块专门用来处理键盘事件。通过这个模块我们就可以得知键盘要唤起,还是要消失。
import React, { Component } from 'react';
import { Keyboard, TextInput } from 'react-native';
class Example extends Component {
componentDidMount () {
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow);
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide);
}
componentWillUnmount () {
this.keyboardDidShowListener.remove();
this.keyboardDidHideListener.remove();
}
_keyboardDidShow () {
alert('Keyboard Shown');
}
_keyboardDidHide () {
alert('Keyboard Hidden');
}
render() {
return (
<TextInput
onSubmitEditing={Keyboard.dismiss}
/>
);
}
}
在componentDidMount的时候绑定键盘的两个事件:
- keyboardDidShow, 键盘即将出现
- keyboardDidHide, 键盘即将隐藏
通过Keyboard模块绑定了这两个事件之后就可以在绑定的回调里让tab bar显示和隐藏了。
自定义tab bar
在react-navigation v2中,要实现自定义的tab bar非常简单:
import {
createBottomTabNavigator,
createStackNavigator,
} from 'react-navigation';
class DetailsScreen extends React.Component {
render() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Details!</Text>
</View>
);
}
}
class HomeScreen extends React.Component {
render() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
{/* other code from before here */}
<Button
title="Go to Details"
onPress={() => this.props.navigation.navigate('Details')}
/>
</View>
);
}
}
class SettingsScreen extends React.Component {
render() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
{/* other code from before here */}
<Button
title="Go to Details"
onPress={() => this.props.navigation.navigate('Details')}
/>
</View>
);
}
}
const HomeStack = createStackNavigator({
Home: HomeScreen,
Details: DetailsScreen,
});
const SettingsStack = createStackNavigator({
Settings: SettingsScreen,
Details: DetailsScreen,
});
export default createBottomTabNavigator(
{
Home: HomeStack,
Settings: SettingsStack,
},
{
/* Other configuration remains unchanged */
}
);
这里创建了一个每一个tab项都是一个stack navigator的tab bar。这里当然使用的是默认的tab bar。方法createBottomTabNavigator会返回一个在底部的tab bar。
我们来添加一个自定义的tab bar:
// ...略...
export default createBottomTabNavigator(
{
Home: HomeStack,
Settings: SettingsStack,
},
{
tabBarComponent: CustomTabComponent,
}
);
CustomTabView就是自定义的tab bar。
当程序运行起来以后,react-navigation会把tab bar所需要的内容(tab的label、icon、navigate到什么地方等都通过prop的方式传进来)。但是,我们这里并不打算做其他的定制,所以可以通过一个简单的方式把这些tab bar的item都绘制出来。
这就需要用到react-navigation-tabs。这个包提供了tab bar的所有默认的实现。包括上面提到的props的解析都有。看下代码:
import React from 'react';
import { Keyboard } from 'react-native';
import { BottomTabBar } from 'react-navigation-tabs';
type Prop = {};
type State = { visible: boolean };
export default class CustomTabComponent extends React.Component<Prop, State> {
state: State = { visible: true };
componentDidMount() {
this.kbShowListener = Keyboard.addListener('keyboardDidShow', this.keyboardWillShow);
this.kbHideListener = Keyboard.addListener('keyboardDidHide', this.keyboardWillHide);
}
keyboardWillShow = () => {
console.log('keyboardwillshow');
this.setState({ visible: false });
};
keyboardWillHide = () => {
console.log('keyboardwillhide');
this.setState({ visible: true });
};
componentWillUnmount() {
this.kbShowListener.remove();
this.kbHideListener.remove();
}
render() {
return this.state.visible && <BottomTabBar {...this.props} />;
}
}
在keyboard显示的时候隐藏tab bar:
keyboardWillShow = () => {
this.setState({ visible: false });
};
在键盘隐藏的时候显示tab bar:
keyboardWillHide = () => {
this.setState({ visible: true });
};
显示出全部的tab item:
render() {
return this.state.visible && <BottomTabBar {...this.props} />;
}
最后
处理软键盘导致的tab bar上浮这个问题就完美解决了。其他的很多时候软键盘的出现都会导致类似的问题。基本上都可以通过绑定Keyboard模块的方式来解决。
对于tab bar本身有定制需要的,则可以通过自定义tab bar实现。正好本文解决了软键盘对tab bar的影响,也开是了一个解决自定义tab bar的门。有深度定义tab bar的同学,就需要解析从react-navigation传过来的props了。
自定义react-navigation的TabBar的更多相关文章
- navigation和tabbar上的文字.图片 自定义
[[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blackColor] ...
- React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方
以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation react-native ...
- react-native 学习 ----- React Navigation
很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...
- react-native导航器 react navigation 介绍
开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...
- React Navigation & React Native & React Native Navigation
React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...
- [RN] 04 - React Navigation
react-navigation和react-router的对比: 支持的平台: react-navigation: react-native react-router: react-native.r ...
- React-native 导航插件React Navigation 4.x的使用
React-native 导航插件React Navigation 4.x的使用 文档 英文水平可以的话,建议直接阅读英文文档 简单使用介绍 安装插件 yarn add react-navigatio ...
- [RN] React Navigation 使用中遇到的显示 问题 汇总
React Navigation 使用中遇到的显示 问题 汇总 https://www.jianshu.com/p/8b1f18affc5d
- WijmoJS 中自定义 React 菜单和列表项模板
WijmoJS 中自定义 React 菜单和列表项模板 在V2019.0 Update2 的全新版本中,React 框架下 WijmoJS 的前端UI组件功能再度增强. WijmoJS的菜单和类似列表 ...
- react navigation goBack()返回到任意页面(不集成redux) 一
方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...
随机推荐
- 爬虫之进阶 twisted
简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...
- v8:: fatalProcessOutOfMemory
express项目,用于画图读写图片数据, pm2 作为进城守护. 生产环节报警:v8:: fatalProcessOutOfMemory,xxxx等,一时不知道什么原因. linux系统下使用如下命 ...
- python入门(十):模块、包
模块:py文件包:目录,目录里面包含__init__.py,内容可以是空里面可以包含多个模块文件,还可以包含子包 1.模块和包,可以很方便的提供给其他程序以复用 1) 利于组织复杂工程 我们写代码的时 ...
- Sprite(雪碧图)的应用
雪碧图是根据CSS sprite音译过来的,是将很多很多的小图标放在一张图片上. 使用雪碧图的目的:有时为了美观,我们会使用一张图片来代替一些小图标,但是一个网页可能有很多的小图标,浏览器在显示页面的 ...
- step_by_step_记录那些在VS上使用过的工具
Visual Studio: Any Developer, Any App, Any Platform 在.NET 平台做开发,强大的VS让人爱不释手.刚刚接触.NET平台的时候,去网上寻找开发工具 ...
- Linux - 文件和目录常用命令
文件和目录常用命令 目标 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 ...
- Linux samba多用户挂载
samba 多用户挂载 通过multiuser挂载选项,使用基于密码验证和cifscreds实现访问控制在默认情况下,samba共享挂载后,是通过挂载时的验证来实现对挂载资源的访问控制.通过新的mul ...
- 20. Valid Parentheses (JAVA)
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- python字符串处理内置方法一览表
python字符串处理内置方法一览表 序号 方法及描述 1 capitalize()将字符串的第一个字符转换为大写 2 center(width, fillchar) 返回一个指定的宽度 widt ...
- 【转载】在linux下别用zip 用tar来压缩文件 zip解压后还是utf-8 window10是GBK
3.2 使用 unzip 命令解压缩 zip 文件 将 shiyanlou.zip 解压到当前目录: $ unzip shiyanlou.zip 使用安静模式,将文件解压到指定目录: $ un ...