在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,
  },

Answers:


414

只需将其添加alignSelf: "stretch"到项目的样式表即可。

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

9
链接断开。
卢卡斯·努斯

2
使用alignSelf拉伸,Android遇到了一个问题-我的图像具有“绝对”位置,在这种情况下,即使使用“拉伸”,此类框也会填充到其中包含的元素的边缘。在我的情况下,Dimensions.get('window')。width在iOS和Android上均可使用。
st_bk

这种方法解决了我所有的“全幅宽度”问题,请查看:快餐
.expo.io

1
似乎也width: "100%"应该起作用,但是不起作用。我想我不明白什么时候alignSelf: "stretch"可以工作 width: "100%"。@Corentin有什么想法吗?谢谢!
乔尔(Joel)

4
@st_bk在那里是救生员!但是,对于绝对定位并需要伸展的事件,我发现了一个更好的解决方案:position: absolute, top: 0, bottom: 0, left: 0, right: 0
lance.dolan

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
梅丽·穆库克 alignSelf:Corentin S.建议的“伸展”是最简单,最简单的,所以我接受了这个答案。但是,有了Dimensions使我找到了一种新的布局布局方法。在某些情况下,我们可以通过编程方式调整项目,谢谢!
franfran 2015年

1
@Melih我发现返回的宽度在我的Android设备上是错误的。正确的宽度应为720px,但返回360px。
Peacepassion '16

4
@peacepassion,您得到了360,因为设备的dpi缩放为2倍。试试Dimensions.get('window').scale-您的情况应该返回2。
matusalem

感谢您的回答,我正在处理一个有背景的容器,您的建议非常合适。
clarenswd

6
旋转设备时将无法使用。最好使用自适应布局。
laynemoseley

26

编辑:

为了仅显示中间文本,可以采用其他方法- 取消其他视图的显示。

  • 让flexDirection保持在“ column”
  • alignItems : 'center'从容器中取出
  • 添加alignSelf:'center'到您不想弯曲的文本视图中

您可以将Text组件包装在View组件中,并将View的flex设置为1。

该flex将给出:

如果为flexDirection:'row'in styles.container,则为100%宽度

如果为flexDirection:'column'in styles.container,则高度为100%


是的,我尝试将flexDirection:'row'和flex:1设置为使宽度达到100%。但是,这些组件都是内联的,无法转到下一行。甚至我用flexWrap: '包装'
franfran

新方法franfran有运气吗?
Nishanth Shankar

alignSelf:Corentin S.作品建议的“伸展”。
franfran 2015年

8

干得好:

只需按照以下方式更改line1样式:

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

6

使用javascript获取宽度和高度,并以View的样式添加它们。要获得完整的宽度和高度,请使用Dimensions.get('window').width https://facebook.github.io/react-native/docs/dimensions.html

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

然后,

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

哦,我喜欢这个。可能不是最好的解决方案,但确实解决了我的问题。更不用说它通常是一个非常简洁的功能。
凯文·厄斯特基尔德(KevinØsterkilde)

5

首先添加Dimension组件:

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

第二个定义变量:

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

第三把它放在样式表中:

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

实际上,在此示例中,我只想制作响应式视图,并且只想查看屏幕视图的0.25,所以我将其乘以0.25,如果您希望屏幕的100%不要将其与以下任何内容相乘:

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

2

注意:尝试完全了解flex概念。

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

请提供正确答案。在未首先说明其含义之前,请勿提供链接。
Akaisteph19年

-1

width: '100%'alignSelf: 'stretch'没有为我工作。Dimensions不适合我的任务,因为我需要在深度嵌套的视图上进行操作。如果我重写您的代码,这对我有用。我刚刚添加了更多Views并使用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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.