Android TextViewに改行を追加する方法は?


157

TextViewに改行を追加しようとしています。

提案された\ nを試しましたが、何も起こりません。これが私のテキストの設定方法です。

TextView txtSubTitle = (TextView)findViewById(r.id.txtSubTitle);
txtSubTitle.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

これは私の文字列です: <string name="sample_string">some test line 1 \n some test line 2</string>

次のように表示されます。

some test line 1
some test line 2

しかし、次のように表示されますsome test line 1 some test line 2

何か不足していますか?


android:linesを少なくとも2に設定しましたか?
Robby Pond

私の字幕はすでに最大6〜9行に達し、テキストを次の行に折り返しますが、分割したい場合は分割しません。
dropsOfJupiter

ソリューションを回答として投稿し、それを受け入れる必要があります。
bigstones 2011年

1
小さなサンプルプロジェクトを作成して、改行をエンコードするさまざまな方法とその副作用を説明しました。スポイラー:\n確かに最良の方法です。github.com/paour/StringResourceTest
Pierre-Luc

なぜこの質問は賛成票が投じられるのですか?まったく調べた?解決策は非常に簡単です。そのHtml.fromHtml()関数を削除して、を使用するだけtxtSubTitle.setText(getResources().getString(R.string.sample_string))です。
Bugs Happen

回答:


222

\n このように私のために働きます:

<TextView android:text="First line\nNext line"

87
ただ、\n一人の意志の仕事... Doが考えていない\r何かを行います。
Peter Ajtai

5
\ r \ nこれはWindowsの改行であり、\ nはlinuxの改行です
ギルヘルメトーレスカストロ

私にとっては機能しません<TextView android:layout_width = "50dp" android:layout_height = "70dp" android:layout_weight = "1" android:background = "@ drawable / keypad1" android:gravity = "center" android:text = " 2 ABC "/>
AndroidRaji 2012年

1
文字列の前後に引用符を追加するという、あなたが行った他の変更について言及していないことで誤解を招く。
Patrick

2
「\ r」は実際には「r」としてテキストに表示されます。したがって、他の人が示唆しているように、 '\ n'でうまくいきます。
Miha Markic

93

わかりました:

<string name="sample_string"><![CDATA[some test line 1 <br />some test line 2]]></string>

したがって、CDATAでラップする必要があり、HTMLタグとして内部に改行が追加されます


3
これを文字列リソースで使用&#xa; 「こんにちは!1行目!&#xa;これは2行目です」
RexSplode 2017年

3
これにはを使用する必要がありますがHtml.fromHtml()、これは単純な改行には少しかかり、翻訳プロバイダーでは十分にサポートされていません。
Pierre-Luc Paour 2017年

真剣にやって来ますか?あなたは彼の質問で問題を見つけることができませんでしたか?
Bugs Happen

68

Androidバージョン1.6は\ r \ nを認識しません。代わりに、System.getProperty( "line.separator")を使用してください。

String s = "Line 1"
           + System.getProperty ("line.separator")
           + "Line 2"
           + System.getProperty ("line.separator");

3
賛成投票!これは私のために働いた!フォームに改行を追加するだけの場合:textView.setText(string1 + System.getProperty( "line.separator")+ string2); それからそれは御馳走を働かせます、ありがとう!
2012

WAT?Windowsを実行しているAndroidバージョンはありますか?
maaartinus 14

3
Xamarinを使用している人にとっては、これは同等です:Java.Lang.JavaSystem.LineSeparator()
スティーブ

1
なぜ単純にSystem.lineSeparator()ではないのですか?
George Z.

60

改行(\ n)は、文字列リソース値を次のように引用符で囲んだ場合にのみ機能します。

<string name="sample_string">"some test line 1 \n some test line 2"</string>

次のように引用符なしで配置すると、改行は行われません。

<string name="sample_string">some test line 1 \n some test line 2</string>

はい、それはとても簡単です。


3
この見積もりは、文字列リソース内の特殊文字やギリシャ語やロシア語などの言語でも問題なく機能することを追加したいと思います...(問題が発生した場合)
datayeah

1
おかげで、引用符を使用することは、長い複数行のテキストの読みやすさを維持するためのより良い解決策だと思います <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
引用符を使用すると、スペースを常に意味のあるものにするなど、他の副作用があります(引用符がないと、インデントなどの行内の複数のスペースは折りたたまれます)。
Pierre-Luc Paour

33

上記のすべてを試してみましたが、自分でいくつかの調査を行った結果、改行エスケープ文字をレンダリングするための次のソリューションが得られました。

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. replaceメソッドを使用して、エスケープされた改行をフィルタリングする必要があります(例: '\\ n')

  2. その後、改行「\ n」のエスケープ文字の各インスタンスが実際の改行にレンダリングされます

この例では、Google Apps Scripting noSQLデータベース(ScriptDb)とJSON形式のデータを使用しました。

乾杯:D


text.replace( "\\ n"、System.getProperty( "line.separator"))
Mussa


17

これには2つの方法があります。文字列を生の文字列として使用する場合は、改行文字を使用する必要があります。HTMLとして使用する場合、たとえばで解析する場合はHtml.fromString、2番目のバリアントの方が適しています。

1)改行文字 \n

<string name="sample> This\nis a sample</string>

2)HTML改行タグ<br>または<br />

<string name="sample> This<br>is a sample</string>

6
反対投票はしませんでしたが、コードが間違っていると思います。「<br>」ではなく「&lt; br>」が必要です。<は予約済みの記号であるため機能しません。
JPM 2014

<br><u><b>および<i>タグはエスケープせずに文字列リソースで許可されている、と正しくによって適用されますTextView.setText(resId)。セクションでContext.getString(resId)ラップしない限り、を使用するとストリップされCDATAます。
Pierre-Luc Paour 2017年

16

これは私にとってはうまくいきました、多分誰かがこれが役立つとわかるでしょう:

TextView textField = (TextView) findViewById(R.id.textview1);
textField.setText("First line of text" + System.getProperty("line.separator") + "Linija 2");

11

XMLを使用してTextViewの使用を宣言する場合、android:singleLine = "false"またはJavaで使用する場合は、txtSubTitle.setSingleLine(false);


いいえ、それはうまくいきませんでした。Html.fromHtml()と文字列リソースと関係がありますか?
dropsOfJupiter

@dropsOfJupiter:Html.fromHtml()コールが何を返しているのを見ましたか?私はそれを文字列に割り当て、デバッガーでそれを見てみたいと思います。
2011年

10

Android Studio 0.8.9を使用。私のために働いた唯一の方法はを使用すること\nです。CDATAでラップすることも<br><br />機能することもありません。



8

非常に簡単:「\ n」を使用

    String aString1 = "abcd";
    String aString2 = "1234";
    mSomeTextView.setText(aString1 + "\n" + aString2);

\ n ASCII文字0xAに対応します。これは「LF」または改行です

\ rはASCII文字0xDに対応します。これは「CR」またはキャリッジリターンです。

これは、最初のタイプライターからさかのぼります。最初のタイプライターでは、ラインフィードのみ(およびラインアンダーラインのみを入力)、またはラインフィード+キャリッジリターン(これも行の先頭に移動します)を選択できます。

Android / Javaでは、\ nはキャリッジリターン+ラインフィードに対応します。


6

ローカリゼーションを再確認してください。可能性があります。あるファイル(ローカリゼーション)を編集しようとしていますが、実際は私の場合同じように、別のファイルを使用してプログラムしています。デフォルトのシステム言語はロシア語ですが、英語のローカライズを編集しようとしています。

私の場合、解決策は「\ n」を行区切り文字として使用することです。

    <string name="string_one">line one.
    \nline two;
    \nline three.</string>

4

"&lt;br&#47;&gt;"\ nの代わりに追加することもできます。

これは<br/>のHTMLエスケープコードです

次に、テキストをTexViewに追加できます。

articleTextView.setText(Html.fromHtml(textForTextView));

ねえ、そうは思わない。Androidは実際にはそのナンセンスを出力します。私は試した。それはあなたがHtml.fromHTML(「xmlファイルからの私の文字列」)を実行している場合は特に、ここではHTMLで正常に機能しますが、ではない
dropsOfJupiter

@drops-toString ==> Html.fromHtml(textForTextView).toString()---そして、次のようにすることを忘れないでください:articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());--------つまり、<br/>内部で直接使用するだけですfromHtml()
Peter Ajtai

&lt;br/>スタイル情報が削除されないようにするのに十分なはずです。(公式ドキュメントに基づく)
jpmcosta 2013年

3

Android StudioのString-Editorを使用することもできます。それは自動的にラインブレーキなどを生成します...


2

Html.fromHtml私は単に私が次の行に文字列2を取得するには、このコードを使用し、非推奨しました。

textView.setText(fromHtml("String1 <br/> String2"));

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }

2

それを行う最も簡単な方法は、(リソースフォルダー内の)値/文字列に移動することです

そこで文字列を宣言します。

    <string name="example_string">Line 1\Line2\Line n</string>

そして、あなたの特定のxmlファイルで、次のような文字列を呼び出すだけです

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_string" />

1

私は別の方法を見つけました: " android:maxWidth =" 40dp " "属性を追加する必要があります。もちろん、完全に機能するわけではありませんが、改行されます。


1

\ nうまくいきませんでした。xmlをテキストに変更し、以下のようにtextview textプロパティを構築することで、問題を解決することができました。

android:text="Line 1
Line 2
Line 3

DoubleSpace"

うまくいけば、これは彼らのために\ nうまくいかなかったと言っている人々を助けます。


これが良い解決策だとは思いません。そこに隠された\n文字があります。
アルモ2018年

1

ファイルからテキストを読み取っているので、ファイルに\ nを追加するとテキストに\ nが表示されるため、少し異なるアプローチをとりました。

    final TextView textView = (TextView) findViewById(R.id.warm_up_view);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(getResources().openRawResource(R.raw.warm_up_file));
    while (scanner.hasNextLine()) {
      sb.append(scanner.nextLine());
      sb.append("\n");
    }

    textView.setText(sb.toString());

0

多分あなたはテキストにlfを入れることができますが、それは表示されませんか?コントロールに十分な高さがあることを確認してください。例えば:

正しい:

android:layout_height="wrap_content"

間違っている可能性があります:

android:layout_height="10dp"


0

これを試して:

         TextView calloutContent = new TextView(getApplicationContext());
         calloutContent.setTextColor(Color.BLACK);
         calloutContent.setSingleLine(false);
         calloutContent.setLines(2);
         calloutContent.setText(" line 1" + System.getProperty ("line.separator")+"  line2" );

0

これがどのように機能するかを説明するには、より完全な答えが必要だと思います。

まず、高度な書式設定が必要な場合は、文字列リソースでHTMLを使用する方法についてのマニュアルを確認してください。
その後<br/>、などを使用できます。ただし、コードを使用してテキストを設定する必要があります。

プレーンテキストの場合、静的文字列リソースで改行文字(LF)をエスケープする方法はたくさんあります。

文字列を二重引用符で囲みます

最もクリーンな方法は、文字列を二重引用符で囲むことです。
これにより、空白は折りたたまれずに、表示されているとおりに解釈されます。
その後、このメソッドでは通常、改行を通常どおり使用できます(インデントは使用しないでください)。

<string name="str1">"Line 1.
Line 2.
Line 3."</string>

このモードでは、一部の文字に特別なエスケープが必要なことに注意してください(など\")。

以下のエスケープシーケンスは、引用符付きモードでも機能します。

XMLで単一行を使用して複数行の文字列を表す場合

XMLで改行をエスケープする最もエレガントな方法は、XML / HTMLエンティティ&#xA;またはを使用して、コードポイント(16進数で10または0xA)を使用すること&#10;です。これは、任意の文字をエスケープするXMLの方法です。
ただし、これは引用モードでのみ機能するようです。

もう1つの方法は、単にを使用することですが\n、読みやすさに悪影響を及ぼしますが、これはXMLでは特別なエスケープシーケンスではないため、Android Studioではハイライト表示されません。

<string name="str1">"Line 1.&#xA;Line 2.&#10;Line 3."</string>
<string name="str1">"Line 1.\nLine 2.\nLine 3."</string>
<string name="str1">Line 1.\nLine 2.\nLine 3.</string>

これらのエスケープシーケンスの後に改行や空白を含めないでください。余分なスペースとして解釈されます。


-1

次のようにテキスト区切りを使用します(\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.