React Native固定页脚

时间:2015-04-04 14:43:11

标签: react-native

我尝试创建看起来像现有网络应用的本机应用。我在窗口底部有一个固定的页脚。有人知道如何通过本地反应来实现这一目标吗?

在现有的应用程序中很简单:

.footer {
  position: fixed;
  bottom: 0;
}

20 个答案:

答案 0 :(得分:129)

以下是基于Colin的Ramsay回答的实际代码:

<View style={{flex: 1}}>
  <ScrollView>main</ScrollView>
  <View><Text>footer</Text></View>
</View>

答案 1 :(得分:119)

离开我的头顶,你可以用ScrollView做到这一点。您的顶级容器可以是一个Flex容器,其内部有一个ScrollView,底部有一个页脚。然后在ScrollView内部正常放置你的应用程序的其余部分。

答案 2 :(得分:51)

我在我的应用中使用固定页脚按钮。我实现固定页脚的方式是这样的:

<View style={{flex: 1}}>
<View><Text>my text</Text></View>
<View style={{position: 'absolute', left: 0, right: 0, bottom: 0}}><Text>My fixed footer</Text></View>
</View>

例如,如果键盘出现时需要向上移动页脚,您可以使用:

const {  DeviceEventEmitter } = React

class MyClass {
  constructor() {
     this.state = {
       btnLocation: 0
     }
  }

  componentWillMount() {
     DeviceEventEmitter.addListener('keyboardWillShow', this.keyboardWillShow.bind(this))
     DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide.bind(this))
  }

  keyboardWillShow(e) {
    this.setState({btnLocation: e.endCoordinates.height})
  }

  keyboardWillHide(e) {
    this.setState({btnLocation: 0})
  }
}

然后在固定的页脚类中使用{bottom:this.state.btnLocation}。我希望这有帮助!

答案 3 :(得分:21)

首先获得Dimension,然后通过flex样式

进行操作
var Dimensions = require('Dimensions')
var {width, height} = Dimensions.get('window')

在渲染中

<View style={{flex: 1}}>
    <View style={{width: width, height: height - 200}}>main</View>
    <View style={{width: width, height: 200}}>footer</View>
</View>

另一种方法是使用flex

<View style={{flex: 1}}>
    <View style={{flex: .8}}>main</View>
    <View style={{flex: .2}}>footer</View>
</View>

答案 4 :(得分:15)

@Alexander感谢您提供解决方案

以下是您正在寻找的代码

import React, {PropTypes,} from 'react';
import {View, Text, StyleSheet,TouchableHighlight,ScrollView,Image, Component, AppRegistry} from "react-native";

class mainview extends React.Component {
 constructor(props) {
      super(props);

  }

  render() {
    return(
      <View style={styles.mainviewStyle}>
        <ContainerView/>
          <View style={styles.footer}>
          <TouchableHighlight style={styles.bottomButtons}>
              <Text style={styles.footerText}>A</Text>
          </TouchableHighlight>
          <TouchableHighlight style={styles.bottomButtons}>
              <Text style={styles.footerText}>B</Text>
          </TouchableHighlight>
          </View>
      </View>
    );
  }
}

class ContainerView extends React.Component {
constructor(props) {
      super(props);
}

render() {
    return(
      <ScrollView style = {styles.scrollViewStyle}>
          <View>
            <Text style={styles.textStyle}> Example for ScrollView and Fixed Footer</Text>
          </View>
      </ScrollView>
    );
  }
}

var styles = StyleSheet.create({
  mainviewStyle: {
  flex: 1,
  flexDirection: 'column',
},
footer: {
  position: 'absolute',
  flex:0.1,
  left: 0,
  right: 0,
  bottom: -10,
  backgroundColor:'green',
  flexDirection:'row',
  height:80,
  alignItems:'center',
},
bottomButtons: {
  alignItems:'center',
  justifyContent: 'center',
  flex:1,
},
footerText: {
  color:'white',
  fontWeight:'bold',
  alignItems:'center',
  fontSize:18,
},
textStyle: {
  alignSelf: 'center',
  color: 'orange'
},
scrollViewStyle: {
  borderWidth: 2,
  borderColor: 'blue'
}
});

AppRegistry.registerComponent('TRYAPP', () => mainview) //Entry Point    and Root Component of The App

以下是截图

ScrollView With Fixed Footer

答案 5 :(得分:7)

您可能还想查看NativeBase(http://nativebase.io)。这是React Native的一个组件库,包含一些不错的布局结构(http://nativebase.io/docs/v2.0.0/components#anatomy),包括页眉和页脚。

这有点像Bootstrap for Mobile。

答案 6 :(得分:6)

这里简单的东西:

  

如果您不需要ScrollView这种方法,您可以使用以下代码来实现这样的事情:

Something like this

<View style={{flex: 1, backgroundColor:'grey'}}>
    <View style={{flex: 1, backgroundColor: 'red'}} />
    <View style={{height: 100, backgroundColor: 'green'}} />
</View>

答案 7 :(得分:5)

人们可以在position: absolute

的原生反应中实现类似的功能
let footerStyle = {
  position: 'absolute',
  bottom: 0,
}

但有几件事要记住。

  1. absolute将元素相对于其父元素定位。
  2. 您可能需要手动设置元素的宽度和高度。
  3. 方向更改时宽度和高度会发生变化。这必须手动管理
  4. 实用的样式定义看起来像这样:

    import { Dimensions } from 'react-native';
    
    var screenWidth = Dimensions.get('window').width; //full screen width
    
    let footerStyle = {
      position: 'absolute',
      bottom: 0,
      width: screenWidth,
      height: 60
    }
    

答案 8 :(得分:5)

我发现使用flex是最简单的解决方案。

<View style={{flex:1, 
    justifyContent: 'space-around', 
    alignItems: 'center',
    flexDirection: 'row',}}>

  <View style={{flex:8}}>
    //Main Activity
  </View>
  <View style={{flex:1}}>
    //Footer
  </View>

 </View>

答案 9 :(得分:5)

我这样做的方法是使用flex 1获得一个视图(让我们称之为P),然后在该视图中有另外两个视图(C1和C2),分别具有flex 0.9和0.1(您可以将弹性高度更改为要求的价值)。然后,在C1内部有一个scrollview。这对我很有用。示例如下。

<View style={{flex: 1}}>
    <View style={{flex: 0.9}}>
        <ScrollView>
            <Text style={{marginBottom: 500}}>scrollable section</Text>
        </ScrollView>
    </View>
    <View style={{flex: 0.1}}>
        <Text>fixed footer</Text>
    </View>
</View>

答案 10 :(得分:3)

最好的方法是使用justifyContent属性

# -*- mode: python -*-

block_cipher = None


a = Analysis(['balling.py'],
             pathex=['C:\\Users\\SamsunG\\Desktop\\Python 2017\\convert'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='balling',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='balling')

如果屏幕上有多个视图元素,则可以使用

<View style={{flexDirection:'column',justifyContent:'flex-end'}}>
     <View>
        <Text>fixed footer</Text>
    </View>
</View>

答案 11 :(得分:2)

当flex为正数时,它将使组件具有柔韧性,并且其大小将与其flex值成比例。因此,将flex设置为2的组件所占空间是将flex设置为1的组件所占空间的两倍。

   <View style={{flex: 1}>
            
     <ScrollView>
        //your scroll able content will be placed above your fixed footer content. 
        //when your content will grow bigger and bigger it will hide behind 
        //footer content. 
     </ScrollView>

     <View style={styles.footerContainer}>
        //your fixed footer content will sit fixed below your screen 
     </View>

</View>

答案 12 :(得分:2)

下面是在上面设置页脚和元素的代码。

import React, { Component } from 'react';
import { StyleSheet, View, Text, ScrollView } from 'react-native';
export default class App extends Component {
    render() {
      return (
      <View style={styles.containerMain}>
        <ScrollView>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
          <Text> Main Content Here</Text>
        </ScrollView>
        <View style={styles.bottomView}>
          <Text style={styles.textStyle}>Bottom View</Text>
        </View>
      </View>
    );
  }
}
const styles = StyleSheet.create({
  containerMain: {
    flex: 1,
    alignItems: 'center',
  },
  bottomView: {
    width: '100%',
    height: 50,
    backgroundColor: '#EE5407',
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    bottom: 0,
  },
  textStyle: {
    color: '#fff',
    fontSize: 18,
  },
});

答案 13 :(得分:1)

对于Android与此相关的问题:

app / src / AndroidManifest.xml中的

将windowSoftInputMode更改为以下内容。

<activity
   android:windowSoftInputMode="stateAlwaysHidden|adjustPan">

我在使用react-native和keyboardAwareScroll的ios中对此绝对没有问题。在有人给我这个解决方案之前,我将实现大量的代码来解决这个问题。效果很好。

答案 14 :(得分:1)

如果您仅使用react native,则可以使用以下代码

<View style={{flex:1}}>

{/* Your Main Content*/}
<View style={{flex:3}}>

<ScrollView>
   {/* Your List View ,etc */}
</ScrollView>

</View>

{/* Your Footer */}
<View style={{flex:1}}>
   {/*Elements*/}
</View>


 </View>

此外,您可以在React Native项目中使用https://docs.nativebase.io/,然后执行以下操作

<Container>

{/*Your Main Content*/}
<Content>

<ScrollView>
   {/* Your List View ,etc */}
</ScrollView>

</Content>

{/*Your Footer*/}
<Footer>
   {/*Elements*/}
</Footer>

</Container>

React_Native

NativeBase.io

答案 15 :(得分:1)

在清单文件中设置android:windowSoftInputMode =“ adjustPan”,它将按预期运行。

答案 16 :(得分:1)

我认为最好和最简单的方法如下,将其余的视图放在内容中,将页脚放在单独的视图中。

`<Container>
   <Content>
     <View>
      Ur contents
    </View>
  </Content>
  <View>
  Footer
  </View>
</Container>`

或者您可以使用基于本机的页脚

`<Container>
  <Content>
    <View>
Ur contents
    </View>
  </Content>
<Footer>
Footer
</Footer>
</Container>`

答案 17 :(得分:1)

import {Dimensions} from 'react-native'

const WIDTH = Dimensions.get('window').width;
const HEIGHT = Dimensions.get('window').height;

然后在此编写样式

 position:'absolute',
        top:HEIGHT-80,
        left:0,
        right:0,

像魅力一样工作

答案 18 :(得分:0)

建议1

=>具有固定页脚的正文

deps

Demo Image

编辑2

=>带标签的正文和固定页脚

<View style={{ flex: 1, backgroundColor: 'gray' }}>

        <View style={{ flex: 9, backgroundColor: 'gray',alignItems: 'center', justifyContent: 'center',  }}>
          <Text style={{color:'white'}}>...Header or Body</Text>
        </View>


        <View style={{ flex: 1, backgroundColor: 'yellow', alignItems: 'center', justifyContent: 'center', }}>
          <Text>...Footer</Text>
        </View>

</View>

enter image description here

注释

<View style={{ flex: 1, backgroundColor: 'gray' }}>

        <View style={{ flex: 9, backgroundColor: 'gray', alignItems: 'center', justifyContent: 'center', }}>
          <Text style={{ color: 'white' }}>...Header or Body</Text>
        </View>


        <View style={{ flex: 1, backgroundColor: 'yellow', alignItems: 'center', justifyContent: 'center', }}>
          <View style={{ flex: 1, flexDirection: 'row' }}>
            <TouchableOpacity style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: 'white' }}>
              <View>
                <Text>
                  ...Home
              </Text>
              </View>
            </TouchableOpacity>
            <TouchableOpacity style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: 'white' }}>
              <View>
                <Text>
                  ...Settings
              </Text>
              </View>
            </TouchableOpacity>
          </View>
        </View>
</View>

优势

我们可以使用此简单的页脚,而无需对底部导航做出反应

答案 19 :(得分:0)

我创建了一个包裹。它可能满足您的需求。

https://github.com/caoyongfeng0214/rn-overlaye

<View style={{paddingBottom:100}}>
     <View> ...... </View>
     <Overlay style={{left:0, right:0, bottom:0}}>
        <View><Text>Footer</Text></View>
     </Overlay>
</View>