React Native Flexboxの100%幅


203

すでにいくつかのflexboxチュートリアルを読みましたが、それでもこの単純なタスクを機能させることができません。

赤いボックスの幅を100%にするにはどうすればよいですか?

ここに画像の説明を入力してください

コード:

  <View style={styles.container}>
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    <Text style={styles.line1}>
      line1
    </Text>
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>

スタイル:

container: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
  flexDirection: 'column',
},
welcome: {
  fontSize: 20,
  textAlign: 'center',
  margin: 10,
  borderWidth: 1,
},
line1: {
    backgroundColor: '#FDD7E4',
},
instructions: {
  textAlign: 'center',
  color: '#333333',
  marginBottom: 5,
  borderWidth: 1,
},

ありがとうございました!

更新1: Nishanth Shankarによる提案、ラッパーにflex:1を追加:flexDirection: 'row'

出力:

ここに画像の説明を入力してください

コード:

  <View style={styles.container}>
    <View style={{flex:1}}>
      <Text style={styles.welcome}>
        Welcome to React Natives
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.line1}>
        line1
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.instructions}>
        Press Cmd+R to reload,{'\n'}
        Cmd+D or shake for dev menu
      </Text>
    </View>
  </View>

  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
    borderWidth: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
    borderWidth: 1,
  },
  line1: {
      backgroundColor: '#FDD7E4',
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
    borderWidth: 1,
  },

回答:


414

alignSelf: "stretch"アイテムのスタイルシートに追加するだけです。

line1: {
    backgroundColor: '#FDD7E4',
    alignSelf: 'stretch',
    textAlign: 'center',
},

9
リンクが壊れています。
Lukas Knuth

2
alignSelfストレッチを使用すると、Androidで問題が発生しました。「絶対」位置の画像があり、この場合、「ストレッチ」を使用しても、そのようなボックスは、含まれる要素の端に埋め込まれます。私の場合、Dimensions.get( 'window')。widthはiOSとAndroidの両方で機能しました。
st_bk 2017

この1つの方法で私の「全幅」の問題がすべて解決されました。確認してみてください。snack.expo.io
webdevinci

1
width: "100%"動作するようにも見えますが、動作しません。いつがalignSelf: "stretch"機能 するかわからないと思いますwidth: "100%"。@Corentin何かアイデアはありますか?どうも!
ジョエル

4
@st_bkはそこに命の恩人でした!しかし、私はあなたが絶対に位置をposition: absolute, top: 0, bottom: 0, left: 0, right: 0
決めて

119

次元を使用する必要があります

最初に、ディメンションを定義します。

import { Dimensions } from "react-native";

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

次に、line1以下のようにスタイルを変更します。

line1: {
    backgroundColor: '#FDD7E4',
    width: width,
},

3
thx Melih Mucuk!alignSelf:Corentin S.によって提案された「ストレッチ」が最も簡単でシンプルなので、私はその答えを受け入れました。ただし、Dimensionsを使用することで、レイアウトを操作する新しい方法につながります。場合によっては、プログラムでアイテムを調整できます。ありがとうございます。
franfran 2015年

1
@Melih返された幅がAndroidデバイスで間違っていることがわかりました。適切な幅は720pxですが、360pxが返されます。
平和への情熱2016年

4
@peacepassion、デバイスのdpiが2倍に拡大されているため、360になりました 試してくださいDimensions.get('window').scale-これはあなたのケースでは2を返すはずです。
マツサレム2016年

あなたの答えをありがとう、私は背景のある容器を扱っています、そしてあなたの提案は完全に合います。
clarenswd 2016年

7
これは、デバイスが回転している場合は機能しません。アダプティブレイアウトを使用することをお勧めします。
laynemoseley 2016

26

編集:

中央のテキストのみをフレックスするために、別のアプローチを取ることができます- 他のビューをアンフレックスします。

  • flexDirectionを 'column'のままにします
  • alignItems : 'center'コンテナから削除
  • alignSelf:'center'フレックスしたくないテキストビューに追加します

TextコンポーネントをViewコンポーネントにラップして、Viewに1のflexを与えることができます。

フレックスは以下を提供します:

flexDirection:'row'in.styles.containerの場合は100%幅

flexDirection:'column'in。styles.containerの場合、100%の高さ


はい、私はflexDirection: 'row'とflex:1を設定して、幅が100%になるようにしました。ただし、コンポーネントはすべてインラインであり、次の行に進むことはできません。「ラップ」:でも私はflexWrap使用
franfran

新しいメソッドfranfranで運がありますか?
Nishanth Shankar、2015

alignSelf:Corentin S.が提案する「ストレッチ」が機能します。
franfran 2015年

8

どうぞ:

以下のようにline1スタイルを変更するだけです:

line1: {
    backgroundColor: '#FDD7E4',
    width:'100%',
    alignSelf:'center'
}

6

JavaScriptを使用して幅と高さを取得し、ビューのスタイルに追加します。全幅と全高を取得するには、https://facebook.github.io/react-native/docs/dimensions.htmlを使用してDimensions.get('window').width ください

getSize() {
    return {
        width: Dimensions.get('window').width, 
        height: Dimensions.get('window').height
    }
}

その後、

<View style={[styles.overlay, this.getSize()]}>

ああ、私はこれが好きです。おそらく最善の解決策ではありませんが、私の問題は解決しました。言うまでもなく、それは一般的にはかなりきちんとした機能です。
KevinØsterkilde2017年

5

まず、Dimensionコンポーネントを追加します。

import { AppRegistry, Text, View,Dimensions } from 'react-native';

次に、変数を定義します。

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

3番目に、スタイルシートに配置します。

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height*0.25,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

実際にこの例では、レスポンシブビューを作成し、画面ビューの0.25のみを表示したかったので、0.25を掛けました。

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

2

注:フレックスの概念について十分に理解してください。

       <View style={{
          flex: 2,
          justifyContent: 'center',
          alignItems: 'center'
        }}>
          <View style ={{
              flex: 1,
              alignItems: 'center, 
              height: 50, 
              borderWidth: 1, 
              borderColor: '#000' 
          }}>
               <Text>Welcome to React Nativ</Text>
           </View>
           <View style={{
              flex: 1,
              alignItems: 'center,
              borderWidth: 1, 
              borderColor: 'red ', 
              height: 50
            }}
            >
              <Text> line 1 </Text>
            </View>
          <View style={{
            flex: 1,
            alignItems: 'center, 
            height: 50, 
            borderWidth: 1,                     
            borderColor: '#000'
          }}>
             <Text>
              Press Cmd+R to reload,{'\n'}
              Cmd+D or shake for dev menu
             </Text>
           </View>
       </View>

1

alignItems: 'center'コンテナー内のスタイルを削除し、以下に示すようにスタイルに追加textAlign: "center"するだけline1です。

うまくいきます

container: {
  flex: 1,
  justifyContent: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
}

line1: {
    backgroundColor: '#FDD7E4',
    textAlign:'center'
},

1
Style ={{width : "100%"}}

これを試して:

StyleSheet generated: {
  "width": "80%",
  "textAlign": "center",
  "marginTop": 21.8625,
  "fontWeight": "bold",
  "fontSize": 16,
  "color": "rgb(24, 24, 24)",
  "fontFamily": "Trajan Pro",
  "textShadowColor": "rgba(255, 255, 255, 0.2)",
  "textShadowOffset": {
    "width": 0,
    "height": 0.5
  }
}

質問に対する適切な回答を提供してください。ここでそれが何であるかを最初に説明することなくリンクを提供しないでください。
Akaisteph7 19/07/19

-1

width: '100%'そしてalignSelf: 'stretch'私のために働かなかった。Dimensions深くネストされたビューを操作する必要があったため、私のタスクに適していませんでした。私があなたのコードを書き直した場合、これは私のために働いたものです。必要なレイアウトを実現するために、いくつかのを追加し、プロパティをView使用flexしました。

  {/* a column */}
  <View style={styles.container}>
    {/* some rows here */}
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    {/* this row should take all available width */}
    <View style={{ flexDirection: 'row' }}>
      {/* flex 1 makes the view take all available width */}
      <View style={{ flex: 1 }}>
        <Text style={styles.line1}>
          line1
        </Text>
      </View>
      {/* I also had a button here, to the right of the text */}
    </View>
    {/* the rest of the rows */}
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.