web-dev-qa-db-ja.com

Reactネイティブテキストが画面から消えて、ラップを拒否します。何をすべきか?

次のコードは この実際の例 にあります。

私は次の反応ネイティブ要素を持っています:

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

これにより、次の画面が表示されます。

Text off screen app

どのようにしてテキストが画面から出ないようにし、親の80%の幅で画面の中央に閉じ込めることができますか?

さまざまなモバイル画面でこれを実行し、動的にしたいので、widthを使用する必要はないと思うので、flexboxに完全に依存する必要があると思います。

(それが、descriptionContainerHor内にflex: 0.8を持っている最初の理由でした。

私が達成したいのは次のようなものです:

What I want to achieve

ありがとうございました!

62
SudoPlz

以下のリンクから解決策を見つけました。

[Text]テキストは折り返されません#1438

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

Output

彼に感謝したい場合は、以下がGithubプロファイルのユーザーリンクです。

Ally Rippley


編集:2019年4月9日(火)

@ sudoPlzがコメントで言及したように、この回答を更新するflexShrink: 1と連携します。

enter image description here

98
Ashok R

これは 既知のバグ です。 flexWrap: 'wrap'はうまくいきませんでしたが、この解決策はほとんどの人にとってうまくいくようです

コード

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

スタイル

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

descriptionContainerVerflexDirection: rowからそれぞれdescriptionContainerVer2を削除すると機能します。

PDATE(コメントを参照)

あなたが望んでいると思うことを達成するために、いくつかの変更を加えました。まず、descriptionContainerHorコンポーネントを削除しました。次に、垂直ビューのflexDirectionrowに設定し、alignItems: 'center'およびjustifyContent: 'center'を追加しました。垂直ビューは実際には水平軸に沿って積み重ねられているため、名前からVer部分を削除しました。

これで、コンテンツを垂直方向と水平方向に揃えてx軸に沿ってスタックするラッパービューができました。次に、Viewコンポーネントの左右に2つの非表示の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
},

お役に立てれば!

9
Eysi

以下のようなflexを使用して<Text>のラッパーが必要です。

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

この問題を発見した別の解決策は、ビュー内にテキストをラップすることです。また、ビューのスタイルをflexに設定します.1。

5
Joel

これはほとんどの場合、フレックスカラムでも機能しました。

wordWrap: 'break-Word'

この方法では、同じ要素/コンポーネントにハードコードされた幅があってもテキストは折り返されます。

width: 100

あなたの場合:

width: '80%'

私の場合、これは3列を保持し、テキストを読み続けるために重要でした。

お役に立てれば!

0
jasonleonhard

私は同じ問題を抱えていて、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>
0
mcc