Reaguj na natywny tekst wychodzący z mojego ekranu, odmawiając zawijania. Co robić?


123

Poniższy kod można znaleźć w tym przykładzie na żywo

Mam następujący element reagowania:

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

z następującymi stylami:

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

Powoduje to następujący ekran:

Aplikacja tekstowa poza ekranem

Jak mogę powstrzymać tekst przed znikaniem z ekranu i trzymać go w środku ekranu o szerokości np. 80% rodzica.

Myślę, że nie powinienem go używać, widthponieważ będę go uruchamiać na WIELU różnych ekranach mobilnych i chcę, aby był dynamiczny, więc myślę, że powinienem całkowicie polegać flexbox.

(To był pierwszy powód, dla którego miałem flex: 0.8w descriptionContainerHor.

To, co chcę osiągnąć, to coś takiego:

Co chcę osiągnąć

Dziękuję Ci!

Odpowiedzi:


211

Znalazłem rozwiązanie z poniższego linku.

[Tekst] Tekst nie zawija się # 1438

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

Wynik

Poniżej znajduje się link do profilu Github, jeśli chcesz mu podziękować.

Ally Rippley


Edycja: wtorek 09 kwietnia 2019

Jak @sudoPlz wspomniał w komentarzach, działa z flexShrink: 1aktualizacją tej odpowiedzi.

wprowadź opis obrazu tutaj


1
Dzięki, to świetna odpowiedź, ale wypróbowałem ją iz jakiegoś powodu nie zawsze działa (nie mam pojęcia dlaczego: S). flexWrap jest trochę niestabilny w react-native. +1 za podniesienie tego.
SudoPlz,

1
^^^ To jest właściwa odpowiedź tutaj. Zaakceptuj tę operację!
Greg Blass

1
Zwróć uwagę na część informacyjną tej odpowiedzi github.com/facebook/react-native/issues/…
SudoPlz

13
Odkryłem, że w niektórych przypadkach flexShrink: 1zastosowanie widoku rodzica też pomoże.
SudoPlz

To działa. Dzięki.
Uddesh_jain

68

To znany błąd . flexWrap: 'wrap'nie działało dla mnie, ale to rozwiązanie wydaje się działać dla większości ludzi

Kod

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

Style

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

1
zajęło mi dzień znalezienia odpowiedzi ... Dzięki!
Kevin Amiranoff

64

Rozwiązaniem tego problemu jest flexShrink: 1.

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

W zależności od konfiguracji, możesz również potrzebować dodać coś flexShrink: 1do <View>rodzica, aby to zadziałało, więc baw się tym, a ci się uda.

Rozwiązanie zostało odkryte przez Adama Pietrasiaka w tym wątku.


Widok rodzica był również rozwiązaniem dla mnie! Jeśli rodzic miał flexDirection: 'column', tekst odmawiał zawijania.
crestinglight

1
Właśnie uratowałeś mi życie…
Nikandr Marhal

Działało idealnie, dziękuję!
fadzb

31

po prostu musisz mieć opakowanie <Text>z flexem jak poniżej;

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

2
To jedyne właściwe rozwiązanie, które również działa
AlwaysConfused

2
Rzeczywiście, flex: 1to wszystko, czego potrzebujesz.
wystąpienie

10

Działa, jeśli usuniesz odpowiednio flexDirection: rowz descriptionContainerVeri descriptionContainerVer2.

UPDATE (patrz komentarze)

Wprowadziłem kilka zmian, aby osiągnąć to, o czym myślę, że chcesz. Przede wszystkim usunąłem descriptionContainerHorkomponent. Następnie ustawiłem flexDirectionwidoki pionowe na rowi dodałem alignItems: 'center'i justifyContent: 'center'. Ponieważ widoki pionowe są teraz w rzeczywistości ułożone wzdłuż osi poziomej, usunąłem Verczęść z nazwy.

Teraz masz widok opakowania, który powinien wyrównać zawartość w pionie i poziomie i ułożyć ją w stos wzdłuż osi x. Następnie po prostu umieszczam dwa niewidoczne Viewkomponenty po lewej i prawej stronie Textkomponentu, aby wykonać wypełnienie.

Lubię to:

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

I to:

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

Wtedy dostajesz to, o co myślę, że szukałeś.

DALSZE DOSKONALENIA

Teraz, jeśli chcesz ułożyć wiele obszarów tekstowych w niebieskich i pomarańczowych widokach, możesz zrobić coś takiego:

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

Gdzie textWrapjest tak stylizowany:

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

Mam nadzieję że to pomoże!


Ok, zmieniłem nieco pytanie, aby odzwierciedlić to, co naprawdę chcę osiągnąć. A teraz o odpowiedzi: Powodem, którego użyłem, flexDirection: rowbyło to, że (jeśli mam to w głowie) flexDirectiondyktuje kierunek, w którym „dzieci” tego rodzica będą ułożone. Teraz chciałem, aby tekst był środkowym dzieckiem w rodzicu, który ustawia dzieci w rzędzie i zajmuje 80% szerokości rodziców (coś jak na drugim zdjęciu). Czy mógłbyś nieco zaktualizować odpowiedź, aby to odzwierciedlić? Jestem gotów przyjąć to jako odpowiedź.
SudoPlz

Przepraszam za późną odpowiedź, byłem zajęty. Ale zaktualizowałem moją odpowiedź, mam nadzieję, że tego właśnie potrzebujesz.
Eysi

Ta odpowiedź jest ABSOLUTNIE niesamowita. Dokładnie to, czego szukałem, dzięki Elliot !!!!!
SudoPlz

flexDirection: "row"był sednem mojego problemu, próbowałem wszystkiego innego bez powodzenia. Zmień flexDirectionna, columna tekst w nim zawinie się normalnie.
osiemdziesiąt pięć

9

Innym rozwiązaniem, które znalazłem w tym problemie, jest zawijanie tekstu wewnątrz widoku. Ustaw także styl widoku na flex: 1.


2

Chciałem dodać, że miałem ten sam problem i flexWrap, flex: 1 (w komponentach tekstowych), nic flex dla mnie nie działało.

Ostatecznie ustawiłem szerokość opakowania moich składników tekstowych na szerokość urządzenia i tekst zaczął się zawijać. 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} to wszystko, czego potrzebujesz!

Po prostu ustaw „flex” na odpowiednią dla siebie liczbę. A potem tekst się zawinie.


O dziwo, to była poprawka, która zadziałała dla mnie.
Dror Bar

1

W wersji 0.62.2 React Native po prostu umieściłem "flex-shrink: 1" w Container of my "Text", ale zapamiętaj flex-direction: row w widoku kontenera. Dziękuję za pomoc.

Mój kod:

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

moje rozwiązanie poniżej:

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

styl:

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

wynik: [d] mój wynik [1]


Więc używasz statycznej szerokości na rodzica, czego chcieliśmy tutaj uniknąć.
SudoPlz

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

Opisz, która część Twojej odpowiedzi rozwiązuje problemy z PO i dlaczego.
Sebastian B.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.