Реагує рідний текст, що відходить від мого екрана, відмовляючись від обгортання. Що робити?


122

У цьому прямому прикладі можна знайти наступний код

У мене є наступний природний елемент реагування:

'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.8у межах descriptionContainerHor.

Я хочу досягти приблизно такого:

Чого я хочу досягти

Дякую!

Відповіді:


207

Я знайшов рішення знизу.

[Текст] Текст не перекриває # 1438

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

Вихідні дані

Нижче наводиться посилання користувача Github, якщо ви хочете подякувати йому.

Аллі Ріпплі


Редагувати: вівторок, 09 квітня 2019

Як згадується в коментарях @sudoPlz, це працює з flexShrink: 1оновленням цієї відповіді.

введіть тут опис зображення


1
Дякую, це чудова відповідь, але я спробував це, і чомусь це не завжди працює (навіть не знаю, чому: S). flexWrap трохи лущиться у реальній реакції. +1, хоча, щоб виховувати це.
SudoPlz

1
^^^ Це фактична відповідь тут. Прийміть цю оп!
Грег Бласс

1
Просто зауважте інформаційну частину цієї відповіді github.com/facebook/react-native/isissue/…
SudoPlz

12
Я виявив, що в деяких випадках flexShrink: 1застосований до батьківського виду також допоможе.
SudoPlz

Це працює. Дякую.
Uddesh_jain

68

Це відома помилка . flexWrap: 'wrap'не працювало для мене, але таке рішення, здається, працює для більшості людей

Код

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

Стилі

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

1
просто взяв у мене день, щоб знайти вашу відповідь ... Дякую!
Кевін Аміранов

63

Вирішення цього питання є flexShrink: 1.

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

В залежності від набору, ви можете також необхідно додати flexShrink: 1в <View>батьківську , а також, щоб отримати цю роботу, так що грати з цим , і ви будете робити це.

Рішення було відкрито Адамом П'єтрасяком у цій темі.


Батьківський погляд був також рішенням для мене! Якщо у батьків був flexDirection: "стовпець", текст відмовлявся обгортати.
crestinglight

1
Ти щойно врятував мені життя…
Нікандр Мархал

Працювали чудово, Дякую!
fadzb

31

вам просто потрібно мати обгортку для вашого <Text>флексу, як показано нижче;

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

2
Це єдине правильне рішення, яке насправді працює
AlwaysConfused

2
Дійсно, flex: 1це все, що вам потрібно.
екземпляр

10

Це працює , якщо ви видалите flexDirection: rowз descriptionContainerVerі 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

Вибачте за пізню відповідь, були зайняті. Але я оновив свою відповідь, сподіваюся, це те, що вам потрібно.
Eysi

Ця відповідь АБСОЛЮТНО дивовижна .. Саме те, що я шукав, дякую Елліот !!!!!
SudoPlz

flexDirection: "row"була стрижнем моєї проблеми, спробувала все інше без удачі. Змініть flexDirectionTo columnі текст всередині нього буде звернути нормально.
вісімдесят п'яти

8

Ще одне рішення, яке я знайшов у цій проблемі, - це загортання тексту всередині подання. Також встановіть стиль View для згинання: 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

У версії 0.62.2 React Native я просто помістив "flex-shrink: 1" у контейнер мого "Text", але запам’ятайте flex-smer: рядок у Вид контейнера. Дякую, хлопці, за допомогу.

Мій код:

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

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

Опишіть, будь ласка, яка частина Вашої відповіді вирішує проблеми ОП та чому.
Себастьян Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.