回答:
TextView
Unicodeの改行なしスペース文字(\u00A0
)を尊重します。これは、HTMLよりも簡単で軽量なソリューションです。
解読可能なソリューションを使用することが可能です。テキストに\u00A0
or  
または 
/ を含め 
ても、16進コードを覚えていない限り、ソースコードの読者(またはそのためのトランスレータ)に多くの情報は伝わりません。次に、名前付きエンティティを使用する方法を示しますstrings.xml
。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
これにより、不足している宣言が作成されます。元のHTML宣言は、通常のXHTML DTDから参照されるhttps://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.entにあります。これはすべて機能します。XMLパーサーがこれらを読み取り、ファイルの読み込み中に置換するため、結果のコンパイル済みリソースにエンティティが存在しないからです。
Androidテキスト(CharSequence
)リソース<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this 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"
/>
Android文字列(フォーマット済み)リソース<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is 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 ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
デバイスとプレビュー(プレビューはエンティティを認識せず、Java文字列はリテラルテキストです!)
これらはDTDエンティティの使用例にすぎず、独自の設定に基づいて使用します。
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
’
文字を適切に処理し、アポストロフィエンティティを作成する必要はありません。<string name="original">Don’t wrap %1$s</string>
期待どおりに動作します。
'
VSを比較し’
ます。Androidはより豪華なUnicode文字で問題はありませんが、エスケープが必要なASCII 0x27で問題があります。エンティティは便利なだけです。それが便利な場所を示すためにここに置いています。
文字列に\u00A0
con
とparam1
同じファイル内に。
私が遭遇した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>