反应本机文本从我的屏幕上消失,拒绝换行。该怎么办?


121

此实时示例中可以找到以下代码

我有以下反应本机元素:

'use strict';

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

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

        <View style={styles.descriptionContainerVer}>
          <View style={styles.descriptionContainerHor}>
            <Text style={styles.descriptionText} numberOfLines={5} >
              Here is a really long text that you can do nothing about, its gonna be long wether you like it or not, so be prepared for it to go off screen. Right? Right..!
            </Text>
          </View>
        </View>

        <View style={styles.descriptionContainerVer2}>
          <View style={styles.descriptionContainerHor}>
            <Text style={styles.descriptionText} numberOfLines={5} >Some other long text which you can still do nothing about.. Off the screen we go then.</Text>
          </View>
        </View>



  </View>);
  }
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);

具有以下样式:

var styles = StyleSheet.create({
  container:{
        flex:1,
    flexDirection:'column',
        justifyContent: 'flex-start',
        backgroundColor: 'grey'
    },
    descriptionContainerVer:{
    flex:0.5, //height (according to its parent)
    flexDirection: 'column', //its children will be in a row
    alignItems: 'center',
    backgroundColor: 'blue',
    // alignSelf: 'center',
  },
  descriptionContainerVer2:{
    flex:0.5, //height (according to its parent)
    flexDirection: 'column', //its children will be in a row
    alignItems: 'center',
    backgroundColor: 'orange',
    // alignSelf: 'center',
  },
  descriptionContainerHor:{
    //width: 200, //I DON\'T want this line here, because I need to support many screen sizes
    flex: 0.3,  //width (according to its parent)
    flexDirection: 'column',    //its children will be in a column
    alignItems: 'center', //align items according to this parent (like setting self align on each item)
    justifyContent: 'center',
    flexWrap: 'wrap'
  },
  descriptionText: {
    backgroundColor: 'green',//Colors.transparentColor,
    fontSize: 16,
    color: 'white',
    textAlign: 'center',
    flexWrap: 'wrap'
  }
});

这将显示以下屏幕:

屏幕外文字应用

我如何才能阻止文本从屏幕上消失,并将其限制在屏幕中间,宽度为父级的80%。

我认为我不应该使用它,width因为我将在许多不同的移动屏幕上运行此代码,并且希望它具有动态性,因此我认为我应该完全依靠flexbox

(这是最初的原因,我不得不flex: 0.8descriptionContainerHor

我想要实现的是这样的:

我想实现的目标

谢谢!

Answers:


204

我从下面的链接中找到了解决方案。

[文字]文字未包装#1438

<View style={{flexDirection:'row'}}> 
   <Text style={{flex: 1, flexWrap: 'wrap'}}> You miss fdddddd dddddddd 
     You miss fdd
   </Text>
</View>

输出量

如果您要感谢他,下面是Github个人资料用户链接。

艾莉·里普利(Ally Rippley)


编辑:2019年4月9日星期二

正如@sudoPlz在评论中提到的,它可以flexShrink: 1更新此答案。

在此处输入图片说明


1
谢谢,这是一个很好的答案,但是我已经尝试过了,由于某种原因,它并不总是有效(不知道为什么:S)。flexWrap在本机方面有点片状。尽管+1却带来了。
SudoPlz

1
^^^这是这里的实际答案。接受此操作!
格雷格·布拉斯

1
只需注意此答案的信息部分github.com/facebook/react-native/issues/…–
SudoPlz

11
我发现在某些情况下flexShrink: 1将其应用于父视图也会有所帮助。
SudoPlz

这可行。谢谢。
Uddesh_jain

67

这是一个已知的错误flexWrap: 'wrap'不适用于我,但此解决方案似乎对大多数人都有效

<View style={styles.container}>
    <Text>Some text</Text>
</View>

款式

export default StyleSheet.create({
    container: {
        width: 0,
        flexGrow: 1,
        flex: 1,
    }
});

1
刚花了我一天时间找到您的答案...谢谢!
凯文·阿米拉诺夫

62

解决这个问题的方法是flexShrink: 1

<View
    style={{ flexDirection: 'row' }}
> 
   <Text style={{ flexShrink: 1 }}>
       Really really long text...
   </Text>
</View>

根据您的设置,您还可能还需要添加flexShrink: 1<View>的父项,以使其正常工作,因此您可以尝试一下。

该解决方案是由Adam Pietrasiak此线程中发现的


父母的观点也是我的解决方案!如果父级具有flexDirection:'column',则文本拒绝换行。
crestinglight

1
您刚刚救了我的命……
Nikandr Marhal

工作完美,谢谢!
fadzb

31

您只需要为您<Text>的flex 包装,如下所示;

<View style={{ flex: 1 }}>
  <Text>Your Text</Text>
</View>

2
那就是唯一
可行的

2
确实,这flex: 1就是您所需要的。
instanceof'sep

9

如果您分别flexDirection: rowdescriptionContainerVer和删除,它将起作用descriptionContainerVer2

更新(请参阅评论)

我做了一些更改以实现我认为的目标。首先,我删除了该descriptionContainerHor组件。然后flexDirection,将的垂直视图设置为,row并添加alignItems: 'center'justifyContent: 'center'。由于实际上垂直视图是沿水平轴堆叠的,因此我Ver从名称中删除了该零件。

因此,现在您有了一个包装器视图,该视图应垂直和水平对齐其内容并将其沿x轴堆叠。然后,我简单地在View组件的左侧和右侧放置两个不可见的Text组件以进行填充。

像这样:

<View style={styles.descriptionContainer}>
  <View style={styles.padding}/>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Here is a really long text that you can do nothing about, its gonna be long wether you like it or not, so be prepared for it to go off screen. Right? Right..!
    </Text>
  <View style={styles.padding}/>
</View>

还有这个:

descriptionContainer:{
  flex:0.5, //height (according to its parent),
  flexDirection: 'row',
  backgroundColor: 'blue',
  alignItems: 'center',
  justifyContent: 'center',
  // alignSelf: 'center',
},
padding: {
  flex: 0.1
},
descriptionText: {
  backgroundColor: 'green',//Colors.transparentColor,
  fontSize: 16,
  flex: 0.8,
  color: 'white',
  textAlign: 'center',
  flexWrap: 'wrap'
},

然后,您得到了我相信的追求。

进一步改进

现在,如果您想在蓝色和橙色视图中堆叠多个文本区域,则可以执行以下操作:

<View style={styles.descriptionContainer2}>
  <View style={styles.padding}/>
  <View style={styles.textWrap}>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Some other long text which you can still do nothing about.. Off the screen we go then.
    </Text>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Another column of text.
    </Text>
  </View>
  <View style={styles.padding}/>
</View>

哪里textWrap是风格是这样的:

textWrap: {
  flexDirection: 'column',
  flex: 0.8
},

希望这可以帮助!


好的,我对问题做了一些修改以反映我真正希望实现的目标。现在再来回答:我使用的原因flexDirection: row是因为(如果我flexDirection脑子里有这个权利)规定了那个父母的“孩子”堆叠的方向。现在,我希望文本成为父母的中间孩子,该孩子连续堆叠孩子,并占据父母宽度的80%(有点像第二张照片)。您能否将答案更新一下以反映这一点?我愿意接受这个答案。
SudoPlz,2016年

抱歉,回复晚了,很忙。但我已经更新了答案,希望这是您所需要的。
艾西(Eysi)'16

这个答案绝对是惊人的。。正是我一直在寻找的东西,谢谢艾略特!
2016年

flexDirection: "row"是我问题的核心,没有运气就尝试了其他所有方法。更改flexDirectioncolumn,其中的文本将正常换行。
十八十八

8

我发现此问题的另一个解决方案是将Text包裹在View中。还要将View的样式设置为flex:1。


2

我想补充一点,我遇到了同样的问题,而flexWrap,flex:1(在文本组件中),没有什么flex对我有用。

最终,我将文本组件的包装器的宽度设置为设备的宽度,然后文本开始包装。 const win = Dimensions.get('window');

      <View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'center',
        alignSelf: 'center',
        width: win.width
      }}>
        <Text style={{ top: 0, alignSelf: 'center' }} >{image.title}</Text>
        <Text style={{ alignSelf: 'center' }}>{image.description}</Text>
      </View>

1
<View style={{flexDirection:'row'}}> 
   <Text style={{ flex: number }}> You miss fdddddd dddddddd 
     You miss fdd
   </Text>
</View>

{flex:aNumber}是您所需要的!

只需将“ flex”设置为适合您的数字即可。然后文本将自动换行。


奇怪的是,这实际上是对我有用的解决方案。
Dror Bar

1

在React Native的0.62.2版本中,我只是将“ flex-shrink:1”放在“文本”的容器中,但请记住flex-direction:row在容器视图中。谢谢你们的帮助。

我的代码:

export const Product = styled.View`
  background: #fff;
  padding: 15px 10px;
  border-radius: 5px;
  margin: 5px;
  flex-direction: row;
`;

export const ProductTitleContainer = styled.View`
  font-size: 16px;
  margin-left: 5px;
  flex-shrink: 1;
`;

export const ProductTitle = styled.Text`
  font-size: 16px;
  flex-wrap: wrap;
`;
`;

-1

我的解决方案如下:

<View style={style.aboutContent}>
     <Text style={[styles.text,{textAlign:'justify'}]}>
        // text here                            
     </Text>
</View>

样式:

aboutContent:{
    flex:8,
    width:widthDevice-40,
    alignItems:'center'
},
text:{
    fontSize:widthDevice*0.04,
    color:'#fff',
    fontFamily:'SairaSemiCondensed-Medium'
},

结果:[d]我的结果[1]


因此,您在父级上使用的是静态宽度,这正是我们在此要避免的。
SudoPlz

-2
<Text style={{width: 200}} numberOfLines={1} ellipsizeMode="tail">Your text here</Text>

请描述您的答案的哪一部分解决了OP的问题以及原因。
Sebastian B.
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.