React pied de page fixe natif

J'essaie de créer une application native react qui ressemble à une application Web existante. J'ai un fixe en bas de la fenêtre. Quelqu'un a-t-il une idée de comment cela peut être réalisé avec react native?

Dans l'application existante, c'est simple:

.footer {
  position: fixed;
  bottom: 0;
}
76
demandé sur Mosh Feu 2015-04-04 17:43:11

11 réponses

Du haut de ma tête, vous pouvez le faire avec un ScrollView . Votre conteneur de niveau supérieur pourrait être un conteneur flexible, à l'intérieur qui a un ScrollView en haut et votre pied de page en bas. Ensuite, à L'intérieur du ScrollView, mettez simplement le reste de votre application comme d'habitude.

88
répondu Colin Ramsay 2017-01-26 23:41:27

Voici le code réel basé sur la réponse de Colin Ramsay:

<View style={{flex: 1}}>
  <ScrollView>main</ScrollView>
  <View><Text>footer</Text></View>
</View>
108
répondu Alexander Zaytsev 2017-09-24 08:20:52

J'utilise des pieds de page fixes pour les boutons de mon application. La façon dont j'implémente un pied de page fixe est la suivante:

<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>

Et si vous avez besoin du pied de page pour monter quand un clavier apparaît par exemple, vous pouvez utiliser:

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})
  }
}

, Puis utilisez {bas: c'.état.btnLocation} dans votre classe de pied de page fixe. J'espère que cela aide!

45
répondu dahveed707 2016-01-12 23:05:04

Vous obtenez d'abord la Dimension, puis la manipulez à travers le style flex

var Dimensions = require('Dimensions')
var {width, height} = Dimensions.get('window')

Dans le rendu

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

L'autre méthode consiste à utiliser flex

<View style={{flex: 1}}>
    <View style={{flex: .8}}>main</View>
    <View style={{flex: .2}}>footer</View>
</View>
19
répondu syarul 2015-11-06 06:28:52

@Alexandre Merci pour la solution

voici le code à exactement ce que vous recherchez

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

Ci-dessous est la capture d'écran

ScrollView Avec Pied De Page Fixe

14
répondu Ashok R 2016-05-30 06:44:15

Vous pouvez également jeter un oeil à NativeBase ( http://nativebase.io ). Ceci est une bibliothèque de composants pour React Native qui incluent une belle structure de mise en page ( http://nativebase.io/docs/v2.0.0/components#anatomy ) y compris les en-têtes et les pieds de page.

C'est un peu comme Bootstrap pour Mobile.

6
répondu Simon Ordish 2017-02-27 15:36:21

Des trucs simples ici:

Au cas où vous n'auriez pas besoin D'un ScrollView pour cette approche, vous pouvez utiliser le code ci-dessous pour réaliser quelque chose comme ceci:

Quelque chose comme ceci

<View style={{flex: 1, backgroundColor:'grey'}}>
    <View style={{flex: 1, backgroundColor: 'red'}} />
    <View style={{height: 100, backgroundColor: 'green'}} />
</View>
5
répondu Cherag Verma 2017-12-21 09:19:22

On pourrait réaliser quelque chose de similaire dans react native avec position: absolute

let footerStyle = {
  position: 'absolute',
  bottom: 0,
}

, Il ya quelques choses à garder à l'esprit.

  1. absolute positionne l'élément par rapport à son parent.
  2. vous devrez peut-être définir manuellement la largeur et la hauteur de l'élément.
  3. La largeur et la hauteur changent lorsque l'orientation change. Cela doit être géré manuellement

Une définition de style pratique ressemblerait à ceci:

import { Dimensions } from 'react-native';

var screenWidth = Dimensions.get('window').width; //full screen width

let footerStyle = {
  position: 'absolute',
  bottom: 0,
  width: screenWidth,
  height: 60
}
5
répondu Akash Kurian Jose 2018-01-28 10:59:45

La façon dont je l'ai fait était d'avoir une vue (appelons-la P) Avec flex 1, puis à l'intérieur de cette vue ont 2 autres vues (C1 et C2) avec flex 0.9 et 0.1 respectivement (vous pouvez changer les hauteurs de flex aux valeurs requises). Ensuite, à L'intérieur du C1 ont un scrollview. Cela a fonctionné parfaitement pour moi. L'exemple ci-dessous.

<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>
4
répondu Rajesh 2017-06-03 15:18:22

Le meilleur moyen est d'utiliser la propriété justifyContent

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

Si vous avez plusieurs éléments de vue à l'écran, vous pouvez utiliser

<View style={{flexDirection:'column',justifyContent:'space-between'}}>
     <View>
        <Text>view 1</Text>
    </View>
    <View>
        <Text>view 2</Text>
    </View>
    <View>
        <Text>fixed footer</Text>
    </View>
</View>
3
répondu Manzoor Samad 2017-09-21 11:20:40

J'ai trouvé que l'utilisation de flex était la solution la plus simple.

<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>
2
répondu Saif Ahmed 2018-05-15 01:32:20