ChatGPT解决这个技术问题 Extra ChatGPT

反应原生文本离开我的屏幕,拒绝换行。该怎么办?

以下代码可在 this live example 中找到

我有以下反应原生元素:

'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'
  }
});

这将导致以下屏幕:

https://i.stack.imgur.com/fuFhUl.png

如何阻止文本离开屏幕并将其限制在屏幕中间,宽度为父级的 80%。

我认为我不应该使用 width,因为我将在许多不同的移动屏幕上运行它并且我希望它是动态的,所以我认为我应该完全依赖 flexbox

(这就是我在 descriptionContainerHor 中包含 flex: 0.8 的最初原因。

我想要实现的是这样的:

https://i.stack.imgur.com/prvLYl.png

谢谢!


A
Ashok R

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

[Text] Text doesn't wrap #1438

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

https://i.stack.imgur.com/wBg6p.png

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

Ally Rippley

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

正如@sudoPlz 在评论中提到的那样,它可以与flexShrink: 1更新此答案一起使用。

https://i.stack.imgur.com/naCWB.png


谢谢,这是一个很好的答案,但我已经尝试过了,由于某种原因它并不总是有效(不知道为什么:S)。 flexWrap 在 react-native 中有点不稳定。 +1 虽然提出了这一点。
^^^ 这是这里的实际答案。接受这个操作!
请注意此答案的信息部分github.com/facebook/react-native/issues/…
我发现在某些情况下,将 flexShrink: 1 应用于父视图也会有所帮助。
我正在处理自定义卡组件,但这些解决方案不起作用。对我来说,有必要为我的内容容器定义一个恒定的宽度大小(我使用 Dimensions 宽度)。
S
SudoPlz

该问题的解决方案是 flexShrink: 1

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

根据您的设置,您可能还需要将 flexShrink: 1 添加到 <View> 的父级,以使其正常工作,因此请使用它,您会成功的。

该解决方案由 Adam Pietrasiakthis thread. 中发现


父视图也是我的解决方案!如果父级有 flexDirection: 'column',则文本拒绝换行。
你刚刚救了我的命……
D
Dev01

这是a known bugflexWrap: 'wrap' 对我不起作用,但此解决方案似乎对大多数人都有效

代码

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

风格

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

只是花了我一天的时间找到你的答案......谢谢!
当单行文本超出绑定时,我的 android 模拟器永远冻结了。找到并修复这是一个可怕的错误(这个不太相关的 SO 问题是我发现的唯一问题)。这似乎已经修复了它,一个带有 {flexGrow: 1, flex: 1} 的容器和带有 {flex: 1} 的文本。
这适用于“react-native”:“0.68.2”
j
jsina

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

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

那是唯一有效的解决方案
事实上,flex: 1 就是您所需要的。
如果您不希望您的文本占据所有可用空间怎么办?
只有没有附加 <View><Text style={{ flex: 1 }}> 对我也有效。
O
Olcay Ertaş

这对我有用

<View style={{flexShrink:1}}>
  <Text>some long random text...</Text>
</View>

I
Irfan wani

大多数时候,我们在使用 flexDirection: 'row' 时会看到这个问题,因为在其他情况下,它被正确处理了。

无论如何,这里有两种正确换行文本的方法;

第一种方法:

要将文本换行到下一行而不离开显示,我们可以通过限制 <Text> 的宽度来做到这一点;

<Text style={{width: "60%"}}>some long text goes here ...</Text>

上面的代码将文本的宽度限制为可用宽度的 60%,如果整个文本不适合,它会自动换行,即剩余的文本将移动到下一行,依此类推。

第二种方法

在文本元素及其包装它的父元素上设置 flexShrink: 1

例如,

<View style={{ flexShrink: 1, justifyContent: 'space-between', alignItems: 'center', flex: 1, flexDirection: 'row'}}>
    <Text>First long string which goes long....</Text>
    <Text style={{flexShrink: 1}}>This is a long long text which must go out of the screen if we dont style it properly and not do some logic here</Text>
</View>

其他样式只是为了表明结果正常工作。 flexShrink: 1 是您唯一需要的。


J
Joel

我发现这个问题的另一个解决方案是将文本包装在视图中。还将视图的样式设置为 flex:1。


t
technophyle

如果您分别从 descriptionContainerVerdescriptionContainerVer2 中删除 flexDirection: row,它将起作用。

更新(见评论)

我进行了一些更改以实现我认为您所追求的目标。首先,我删除了 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 规定了该父母的“孩子”将被堆叠的方向。现在我希望 text 成为父级中的 middle child,该父级将子级连续堆叠,并占据父级宽度的 80%(类似于第二张照片) .您能否稍微更新一下答案以反映这一点?我愿意接受这个作为答案。
抱歉回复晚了,忙。但我已经更新了我的答案,希望这是你需要的。
这个答案绝对令人惊叹.. 正是我一直在寻找的,谢谢 Elliot !!!!!
flexDirection: "row" 是我问题的核心,没有运气就尝试了其他所有方法。将您的 flexDirection 更改为 column,其中的文本将正常换行。
P
Pravin Ghorle
<View style={{flexDirection:'row'}}> 
  <Text style={{flex: 1, flexWrap: 'wrap'}}> 

这将起作用


Flexwrap 是不必要的。
m
mediaguru

我遇到了同样的问题,要解决这个问题,我必须确保所有 View 父母都有 style={{flex: 1}}


M
Marcelo Tchelão

在 React Native 的 0.62.2 版本中,我只是将“flex-shrink: 1”放在我的“Text”的容器中,但请记住容器视图中的 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;
`;
`;

O
Olcay Ertaş

我想补充一点,我遇到了同样的问题,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>

R
Raphael Pinel

我尝试了上面的许多答案,但没有一个对我有用。通过将 flexShrink 放在 Text 元素本身上并将 flexGrow 放在父 ViewText 元素上,我获得了最好的结果。

我需要父级上的 flexDirection: row,因为我想在右侧有一个图标

<View style={flexDirection: 'row', flexGrow: 1}>
    <Text style={
        flexGrow: 1, 
        flexShrink: 1, 
        paddingLeft: 16,
        paddingRight: 8,
        alignItems: 'center',
    }>
        A long text that needs to wrap into multiple lines
    </Text>
</View>
<Image source={rightArrow}/>

它看起来像这样:

https://i.stack.imgur.com/2lVh2.png


l
letanthang

你想念fdddddd dddddddd 你想念fdd

{ flex: aNumber } 就是你所需要的!

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


奇怪的是,这实际上是对我有用的修复程序。
O
Olcay Ertaş
<SafeAreaView style={{flex:1}}>
  <View style={{alignItems:'center'}}>
    <Text style={{ textAlign:'center' }}>
      This code will make your text centered even when there is a line-break
    </Text>
  </View>
</SafeAreaView>

请评论您的代码并解释您的答案
O
Olcay Ertaş

不幸的是,以上都不适合我。

我找到了这个 npm 包,你可以直接使用这个包:https://github.com/Bang9/react-native-wrapped-text

或者创建类似这样的东西:

<View style={{ alignItems: "center", alignSelf: "center", width: "100%" }}>
  <View style={{ flexDirection: "row", flexWrap: "wrap"}}>
    <Text style={{ textAlign: "center"}}>Long text, sooo looong...</Text>
  </View>
</View>

基于:https://github.com/Bang9/react-native-wrapped-text/blob/master/src/index.js


A
Adit Shinde

尝试了一切,但没有任何效果->

wrapText:{
    width:"65%"
},
listItemLeft:{
    fontWeight:"bold",
    margin:3
},

<View style={styles.wrapText}>
    <Text style={styles.listItemLeft}>{item.left}</Text>
</View>

S
Saahiil

我认为你可以做这样的事情,我附上了一张带有代码的图片以获得更好的主意:

https://i.stack.imgur.com/OPV2h.png

所以,我们可以这样做:

TermsOfService = {
  fontFamily: 'Verlag-Book';
  fontSize: 14px;
  textAlign: center;
},
HighlightedText = {
  font-family: 'Verlag-Book';
  font-size: 14px;
  text-align: center;
  color: ${COLORS.PRIMARY_ADMIRAL_BLUE};
},
Container: {
  width: 100%;
  alignSelf: center;
  alignItems: center;
  justifyContent: center;
  flexDirection: row;
  flexWrap: wrap;
}

并且您的组件是否像这样使用它:

 <View style={Container}>
   <Text style={TermsOfService}>By joining, you agree to the some thing </Text>
   <Text style={HighlightedText}>this is highlighted </Text>
   <Text style={TermsOfService}>and </Text>
   <Text style={HighlightedText}>and this as well</Text>
 </View>

W
Wong Jia Hau

没有一个答案对我有用,所以我决定使用 hack,即用空格分割文本并分别渲染每个单词。

虽然这是一个 hack,但好处是我不必担心由于父容器样式而弄乱包装。

// This code is written in Typescript
import React from 'react'
import { StyleSheet, View, Text } from 'react-native'
const styles = StyleSheet.create({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
    flexDirection: 'row',
    flex: 1,
    justifyContent: 'center',
    paddingVertical: 8,
  },
})

export const WrapText: React.FC<{
  text: string
}> = ({ text }) => {
  return (
    <View style={styles.container}>
      {text.split(' ').map((word, index) => (
          <Text key={index}>
            {word}{' '}
          </Text>
        ))}
    </View>
  )
}

const Example = <WrapText text="Hello this is a working hack that wraps your text."/>

P/S:当然这只适用于字母书写系统,其他不使用空格的书写系统(例如中文文字)将不会使用此组件进行换行。


D
Daniel Jose Padilla Peña

在文本样式中使用 height: 'auto'。

https://i.stack.imgur.com/hFA3Q.png


A
Awais Kaleem

尝试在这样的文本组件中使用此道具 adjustsFontSizeToFit={true} 。

<Text adjustsFontSizeToFit={true}>

这使文本大小更小,它不会包裹文本,这就是问题的意图。
N
Nguyễn Phúc

我的解决方案如下:

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

https://i.stack.imgur.com/6FtkP.png


所以你在父节点上使用了一个静态宽度,这正是我们在这里想要避免的。
S
Saurav
<Text style={{width: 200}} numberOfLines={1} ellipsizeMode="tail">Your text here</Text>

请描述您的答案的哪一部分解决了 OPs 问题以及原因。