React Nativeで親の幅の80%のビューを作成する


98

React Nativeでフォームを作成していてTextInput、画面幅の80%にしたいと考えています。

HTMLと通常のCSSでは、これは簡単です。

input {
    display: block;
    width: 80%;
    margin: auto;
}

React Nativeがdisplayプロパティ、パーセンテージ幅、または自動マージンをサポートしていないことを除いて。

では、代わりに何をすべきでしょうか?この問題については、React Nativeの課題追跡にいくらか議論がありますが、提案された解決策は厄介なハックのようです。


1
react-nativeflex要素のサイズと位置に使用します。よくflex-basis
わかり

1
そして、この問題によると何かflex: 0.8が仕事をするかもしれません。
alix 2015年

回答:


84

React Native 0.42以降height:width:パーセンテージを受け入れます。

width: 80%あなたのスタイルシートで使用して、それはうまくいきます。

  • スクリーンショット

  • 親の比率としての実例の
    子の幅/高さ

  • コード

    import React from 'react';
    import { Text, View, StyleSheet } from 'react-native';
    
    const width_proportion = '80%';
    const height_proportion = '40%';
    
    const styles = StyleSheet.create({
      screen: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#5A9BD4',
      },
      box: {
        width: width_proportion,
        height: height_proportion,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#B8D2EC',
      },
      text: {
        fontSize: 18,
      },
    });
    
    export default () => (
      <View style={styles.screen}>
        <View style={styles.box}>
          <Text style={styles.text}>
            {width_proportion} of width{'\n'}
            {height_proportion} of height
          </Text>
        </View>
      </View>
    );

88

それはあなたのニーズに合うはずです:

var yourComponent = React.createClass({
    render: function () {
        return (
            <View style={{flex:1, flexDirection:'column', justifyContent:'center'}}>
                <View style={{flexDirection:'row'}}>
                    <TextInput style={{flex:0.8, borderWidth:1, height:20}}></TextInput>
                    <View style={{flex:0.2}}></View> // spacer
                </View>
            </View>
        );
    }
});

17
<View style = {{width:'75% '、borderWidth:1}}> </ View>のみ
user3044484

41

画面の幅を基準にして入力を行うだけの場合は、Dimensionsを使用するのが簡単な方法です。

// De structure Dimensions from React
var React = require('react-native');
var {
  ...
  Dimensions
} = React; 

// Store width in variable
var width = Dimensions.get('window').width; 

// Use width variable in style declaration
<TextInput style={{ width: width * .8 }} />

ここで作業プロジェクトを設定しました。コードも以下にあります。

https://rnplay.org/apps/rqQPCQ

'use strict';

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

var width = Dimensions.get('window').width;

var SampleApp = React.createClass({
  render: function() {
    return (
      <View style={styles.container}>
        <Text style={{fontSize:22}}>Percentage Width In React Native</Text>
        <View style={{marginTop:100, flexDirection: 'row',justifyContent: 'center'}}>
            <TextInput style={{backgroundColor: '#dddddd', height: 60, width: width*.8 }} />
          </View>
      </View>
    );
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop:100
  },

});

AppRegistry.registerComponent('SampleApp', () => SampleApp);

6
React Nativeのドキュメントでは、フロントページのDimensionsパッケージについて言及しているべきです-それは私を驚かせません...
AA Karim

非常に貴重な答え。寸法は実際に非常に便利です。注:「ディメンションはすぐに利用できますが、(デバイスの回転などにより)変更される可能性があるため、これらの定数に依存するレンダリングロジックまたはスタイルは、値をキャッシュするのではなく、すべてのレンダリングでこの関数を呼び出そうとします(たとえば、 StyleSheetに値を設定するのではなく、インラインスタイル)。」
フィル2018年

ランドスケープをサポートし、それらのレイアウトの変更を手動で処理しない場合、Dimensionsを使用すると、レイアウトが画面の回転後に壊れることに注意してください。
ratimihah



5

親の幅のパーセンテージを持たせるために使用する手法は、いくつかのフレックスボックスと組み合わせて追加のスペーサービューを追加することです。これはすべてのシナリオに当てはまるわけではありませんが、非常に役立ちます。

だからここに行きます:

class PercentageWidth extends Component {
    render() {
        return (
            <View style={styles.container}>
                <View style={styles.percentageWidthView}>
                    {/* Some content */}
                </View>

                <View style={styles.spacer}
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flexDirection: 'row'
    },

    percentageWidthView: {
        flex: 60
    },

    spacer: {
        flex: 40
    }
});

基本的にflexプロパティは、フレックスコンテナー内のすべてのアイテムの「合計」フレックスに対する幅です。したがって、すべてのアイテムの合計が100の場合、パーセンテージがあります。この例では、同じ結果にフレックス値6と4を使用することができたため、さらに柔軟になります。

パーセンテージの幅のビューを中央に配置する場合:幅の半分の2つのスペーサーを追加します。したがって、この例では2-6-2になります。

もちろん、追加のビューを追加することは世界で最も良いことではありませんが、実際のアプリでは、スペーサーに異なるコンテンツが含まれることをイメージできます。


スペーサーに異なる内容が含まれると想像できますか?どうして?スペーサーが単なるフィラーhtmlである多くの例を考えることができます。
AlxVallejo 2017年

1

私は更新されたソリューション(2019年後半)を持っています。フックを使って親の80%の幅を取得するには、デバイスが回転しても機能します。

Dimensions.get('window').widthこの例では、デバイスの幅を取得するために使用でき、応答性を向上させる方法を確認できます

import React, { useEffect, useState } from 'react';
import { Dimensions , View , Text , StyleSheet  } from 'react-native';

export default const AwesomeProject() => {
   const [screenData, setScreenData] = useState(Dimensions.get('window').width);

    useEffect(() => {
     const onChange = () => {
     setScreenData(Dimensions.get('window').width);
     };
     Dimensions.addEventListener('change', onChange);

     return () => {Dimensions.removeEventListener('change', onChange);};
    });

   return (  
          <View style={[styles.container, { width: screenData * 0.8 }]}>
             <Text> I'mAwesome </Text>
           </View>
    );
}

const styles = StyleSheet.create({
container: {
     flex: 1,
     alignItems: 'center',
     justifyContent: 'center',
     backgroundColor: '#eee',
     },
});

0

これが私が解決策を得た方法です。シンプルで甘い。画面密度に依存しない:

export default class AwesomeProject extends Component {
    constructor(props){
        super(props);
        this.state = {text: ""}
    }
  render() {
    return (
       <View
          style={{
            flex: 1,
            backgroundColor: "#ececec",
            flexDirection: "column",
            justifyContent: "center",
            alignItems: "center"
          }}
        >
          <View style={{ padding: 10, flexDirection: "row" }}>
            <TextInput
              style={{ flex: 0.8, height: 40, borderWidth: 1 }}
              onChangeText={text => this.setState({ text })}
              placeholder="Text 1"
              value={this.state.text}
            />
          </View>
          <View style={{ padding: 10, flexDirection: "row" }}>
            <TextInput
              style={{ flex: 0.8, height: 40, borderWidth: 1 }}
              onChangeText={text => this.setState({ text })}
              placeholder="Text 2"
              value={this.state.text}
            />
          </View>
          <View style={{ padding: 10, flexDirection: "row" }}>
            <Button
              onPress={onButtonPress}
              title="Press Me"
              accessibilityLabel="See an Information"
            />
          </View>
        </View>
    );
  }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.