2015-12-01 9 views
27

Sono nuovo in flexbox e non riesco a produrre un pulsante a larghezza intera in nativo reattivo. Ho cercato di capirlo da solo per più di un giorno e ho letto ogni articolo/post relativo su Internet senza alcun risultato.Pulsante larghezza intera w/flex-box in nativa reattiva

Mi piacerebbe avere due elementi TextInput che coprono l'intera larghezza dello schermo, con un pulsante sotto di loro che copre anche l'intera larghezza dello schermo. Gli elementi TextInputsono che si estendono per tutta la larghezza dello schermo, ma questo sembra essere di default nel simulatore Android che sto utilizzando.

Ecco il mio codice:

var MyModule = React.createClass({ 
    render: function() { 
    return <View style={styles.container}> 

     <View style={styles.headline}> 
     <Text>Hello World</Text> 
     </View> 

     <View style={styles.inputsContainer}> 

     <TextInput style={[styles.input]} placeholder="Email" /> 
     <TextInput secureTextEntry={true} style={[styles.input]} placeholder="Password" /> 
     <TouchableHighlight style={styles.fullWidthButton} onPress={this.buttonPressed}> 
      <Text>Submit</Text> 
     </TouchableHighlight> 

     </View> 
    </View> 
    }, 
    buttonPressed: function() { 
    console.log('button was pressed!'); 
    } 
}); 

var paddingLeft = 15; 


var styles = StyleSheet.create({ 
    inputsContainer: { 
    // Intentionally blank because I've tried everything & I'm clueless 
    }, 
    fullWidthButton: { 
    // Intentionally blank because I've tried everything & I'm clueless 
    }, 
    input: { 
    paddingLeft: paddingLeft, 
    height: 40, 
    borderColor: 'black', 
    backgroundColor: 'white', 
    }, 
    container: { 
    flex: 1, 
    backgroundColor: '#f0f0f0', 
    alignItems: 'stretch', 
    }, 
    headline: { 
    } 
}); 

module.exports = Onboarding; 

Qualcuno sa cosa devo fare per ottenere il TouchableHighlight a coprire l'intera larghezza dello schermo?

risposta

15

È possibile raggiungere questo impostando un flex: 1 proprietà sull'elemento genitore del TouchableHighlight, poi l'assegnazione di un flexDirection: immobile fila all'elemento TouchableHighlight:

<View style={styles.inputsContainer}> 
    <TouchableHighlight style={styles.fullWidthButton} onPress={this.buttonPressed}> 
     <Text style={styles.fullWidthButtonText}>Submit</Text> 
    </TouchableHighlight> 
</View> 

    inputsContainer: { 
    flex: 1 
    }, 
    fullWidthButton: { 
    backgroundColor: 'blue', 
    height:70, 
    flexDirection: 'row', 
    justifyContent: 'center', 
    alignItems: 'center' 
    }, 
    fullWidthButtonText: { 
    fontSize:24, 
    color: 'white' 
    } 

ho creato un gruppo di lavoro completo esempio here. Inoltre, il codice completo è sotto.

https://rnplay.org/apps/J6fnqg

'use strict'; 

var React = require('react-native'); 
var { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    TouchableHighlight, 
    TextInput, 
} = React; 

var MyModule = React.createClass({ 
    render: function() { 
    return <View style={styles.container}> 

     <View style={styles.headline}> 
     <Text>Hello World</Text> 
     </View> 

     <View style={styles.inputsContainer}> 

     <TextInput style={[styles.input]} placeholder="Email" /> 
     <TextInput secureTextEntry={true} style={[styles.input]} placeholder="Password" /> 
     <TouchableHighlight style={styles.fullWidthButton} onPress={this.buttonPressed}> 
      <Text style={styles.fullWidthButtonText}>Submit</Text> 
     </TouchableHighlight> 

     </View> 
    </View> 
    }, 
    buttonPressed: function() { 
    console.log('button was pressed!'); 
    } 
}); 

var paddingLeft = 15; 


var styles = StyleSheet.create({ 
    inputsContainer: { 
    flex: 1 
    }, 
    fullWidthButton: { 
    backgroundColor: 'blue', 
    height:70, 
    flexDirection: 'row', 
    justifyContent: 'center', 
    alignItems: 'center' 
    }, 
    fullWidthButtonText: { 
    fontSize:24, 
    color: 'white' 
    }, 
    input: { 
    paddingLeft: paddingLeft, 
    height: 40, 
    borderColor: 'black', 
    backgroundColor: 'white', 
    }, 
    container: { 
    flex: 1, 
    backgroundColor: '#f0f0f0', 
    alignItems: 'stretch', 
    }, 
    headline: { 
    } 
}); 



AppRegistry.registerComponent('MyModule',() => MyModule); 
+0

Molte grazie per la risposta. Sfortunatamente, questo non funziona con 0.15.0 react-native in esecuzione su Android 6.0 (e il simulatore Android è rotto nel parco giochi che hai fornito). Copio incollato il tuo file esatto, e il pulsante mostra com'era prima (è semplicemente la larghezza del suo testo). È un bug di React? – Bibs

+1

Forse prova questo: var windowWidth = Dimensions.get ('window'). Width;

+0

Ha funzionato! Grazie molto. – Bibs

35

Sono venuto qui cercando la stessa domanda. Dopo aver sperimentato ulteriormente, ho trovato che il modo più semplice è utilizzare alignSelf: 'stretch'. Questo forza il singolo elemento a occupare tutta la larghezza disponibile, ad es.

La risposta di Nader funziona ovviamente, ma questo sembra essere il modo corretto di utilizzare Flexbox.

+2

yay, grazie amico, funziona! –

+1

Ben fatto. Questa dovrebbe essere la risposta accettata. –

+0

su

0

Impressionante mi piace, alignSelf: 'stretch', è la strada da percorrere ..

Problemi correlati