Androidおよび  TextView


108

 TextView に追加することは可能ですか?誰かが同様の機能を達成しましたか?

TextViewに分割できないスペースを確保したいのですが。

回答:


184

TextViewUnicodeの改行なしスペース文字\u00A0)を尊重します。これは、HTMLよりも簡単で軽量なソリューションです。


3
それはうまくいきます。これをxmlまたはJavaコードに追加できます。私はあまりテストしていませんが、Javaコードで問題なく動作しますが、それで十分です。
Mikooos

\ u0020も\ u00A0も機能しません。それらをXMLで設定する(XMLのプレビューでさえも)ことも、JavaでsetText()を使用して設定することもありません。Android 4.1と4.2の両方で試した
Stephan Wiesner

1
これはコンマと一緒には機能しません。このような場合、カンマの直後に改行が表示されます
Alex Bonel

1
\ u00A0は私のためのトリックを行いません。スペースを作るのではなく、単語を結合するだけ-Android 4.4.4、5.0、5.1
Marcel Bro

1
Kotlinでは、非常にうまく機能します。空のスペースをすべてこれに置き換えます。最後の文字から楕円になります。こんにちはWOR ...こんにちは... " "の代わりに" str.replace(」」、 "\ u00A0")、利回り"
ヒソプユン・


24

 解読可能なソリューションを使用することが可能です。テキストに\u00A0or  または / を含め ても、16進コードを覚えていない限り、ソースコードの読者(またはそのためのトランスレータ)に多くの情報は伝わりません。次に、名前付きエンティティを使用する方法を示しますstrings.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

これにより、不足している宣言が作成されます。元のHTML宣言は、通常のXHTML DTDから参照されるhttps://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.entにあります。これはすべて機能します。XMLパーサーがこれらを読み取り、ファイルの読み込み中に置換するため、結果のコンパイル済みリソースにエンティティが存在しないからです。

&nbsp;Androidテキスト(CharSequence)リソース

<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this&nbsp;name</b></string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    android:text="@string/html_text"
    />

デバイスとプレビュー(プレビューはHTMLを認識しません)
デバイス上のHTML プレビュー中のHTML

&nbsp; Android文字列(フォーマット済み)リソース

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;nice</string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    tools:text="@string/formatted_text"
    />

次にコードで:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);

デバイスとプレビュー(プレビューはエンティティを認識せず、Java文字列はリテラルテキストです!)
デバイスでフォーマット プレビューでフォーマット

さらなるトリック

これらはDTDエンティティの使用例にすぎず、独自の設定に基づいて使用します。

<!ENTITY con "\&apos;"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
                            Sadly &apos; cannot be overridden due to XML spec:
                            https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "&#37;1$s"><!-- format string argument #1 -->

<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap &param1;</string>

どちらも強調表示に役立ちます。 ハイライトされたXMLエンティティ


Androidは文字を適切に処理し、アポストロフィエンティティを作成する必要はありません。<string name="original">Don’t wrap %1$s</string>期待どおりに動作します。
Diti

1
@Ditiそれはアポストロフィではなく、それは正しい単一引用符です。'VSを比較します。Androidはより豪華なUnicode文字で問題はありませんが、エスケープが必要なASCII 0x27で問題があります。エンティティは便利なだけです。それが便利な場所を示すためにここに置いています。
TWiStErRob 2016

これはすばらしいです=)ありがとう。私はこれがもっとすっきりとして読みやすいと思います。
Alex Hart

すばらしい回答、ありがとうございます!&nbsp;文字列に\u00A0
含めること

1
もちろん@Seven、追加最後のセクション(さらにトリック)を参照してくださいconparam1同じファイル内に。
TWiStErRob 2018年

18

TextViewは、改行しないスペースを尊重する必要があります

<string name="test">Hello&#160;world</string>

または

new TextView("Hello\u00A0world");

3

私が遭遇した1つのユニークな状況は、String.formatパラメーターを受け取る文字列リソースに改行なしスペースを追加することでした。

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

改行しないスペース文字を文字列にコピーして貼り付けようとしたところ、コンパイル後に通常の古いスペースに置き換えられました。

formatted = "false"を削除し、フォーマット引数に番号を付け、バックスラッシュ表記を使用するとうまくいきました:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>

2

これは私のために働きました:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
    textview.setText(Html.fromHtml(your string);
}

1

これは、TextViewでnbspを使用する例です。

<string name="text">Example:\u00A0</string>


4
それは\ u00A0である必要があります
poitroae
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.