私はこれを持っていますTextView
:
<TextView
Android:id="@+id/issue_journal_item_notes"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/issue_journal_item_details"
Android:layout_below="@+id/issue_journal_item_details"
Android:background="@drawable/journal_item_notes_background"
Android:padding="8dp"
Android:text="issue_journal_item_notes"
Android:textIsSelectable="true" />
私はこれを次のように埋めています:
String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.Android.com/sdk/index.html<br/>(needed for logcat)</p>";
theTextView.setText(Html.fromHtml(html));
その結果、次のようになります。
「譲受人...」は別のTextView
です。
私のTextView
は灰色の背景のものです。その境界は非常に薄い灰色ではっきりと見えます。左側の暗い灰色のバーは背景の一部であるため、TextView
でもあります。
8dpの正方形のパディングがはっきりとわかります。しかし、一番下の空きスペースは何ですか?これはある種のパディングですが、XMLでもコードでも設定していません。
誰かが尋ねた場合、私は必要 HTMLサポートです。上記のスクリーンショットとは異なり、コンテンツにはHTMLコンテンツが含まれている可能性があるためです(<pre>
、<i>
、<b>
など)。
あなたが見ている余分な「パディング」は、実際には単なる改行とそれに続く別の改行です:
Html.fromHtml(...)
の実装に飛び込むと、段落タグを処理する次のメソッドに出くわします。
private static void handleP(SpannableStringBuilder text) {
int len = text.length();
if (len >= 1 && text.charAt(len - 1) == '\n') {
if (len >= 2 && text.charAt(len - 2) == '\n') {
return;
}
text.append("\n");
return;
}
if (len != 0) {
text.append("\n\n");
}
}
上記のスニペットは Android 4.2.2ソース から取得したものです。ロジックは非常に単純で、基本的にすべての段落タグが\n\n
で終わるようにして、2つの要素ブロック間に視覚的なギャップを与えます。これは、Htmlテキスト全体が単一の段落(あなたの場合)のみで構成されているのか、複数の連続する段落で構成されているのかをフレームワークが考慮しないことを意味します-常に変換された段落の終わりで2つの改行になります。
そうは言っても、常に1つの段落を扱っていることがわかっている場合、最も簡単な解決策は、Html.fromHtml(...)
にフィードする前にその折り返し段落を削除することです。これは、他の回答の1つで提案されたものとほぼ同じです。
さて、これは実際にはオプションではないとおっしゃっていたので、代わりにHtml.fromHtml(...)
の結果を「トリム」して、末尾の空白を削除することもできます。 AndroidはSpanned
(通常、これはSpannableStringBuilder
オブジェクトです)を返しますが、残念ながら、組み込みのtrim()
は付属していません。ただし、独自の方法を考え出すことや、そこにあるいくつかの実装の1つを借りることはそれほど難しいことではありません。
trim()
メソッドの基本的な実装は、次のようになります。
public static CharSequence trim(CharSequence s, int start, int end) {
while (start < end && Character.isWhitespace(s.charAt(start))) {
start++;
}
while (end > start && Character.isWhitespace(s.charAt(end - 1))) {
end--;
}
return s.subSequence(start, end);
}
これを使用するには、元のコードを次のように変更します。
String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.Android.com/sdk/index.html<br/>(needed for logcat)</p>";
CharSequence trimmed = trim(Html.fromHtml(html));
theTextView.setText(trimmed);
そして、voilà、前後:
以下のコードも使用できます
myTextView.setText(noTrailingwhiteLines(html));
private CharSequence noTrailingwhiteLines(CharSequence text) {
while (text.charAt(text.length() - 1) == '\n') {
text = text.subSequence(0, text.length() - 1);
}
return text;
}
Html.fromHtml(html)
はSpannable
を返すので、toString()
を呼び出してからtrim
文字列を呼び出し、それをtextview
に設定することで、これを文字列に変換できます。
String html = "<p>Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.Android.com/sdk/index.html<br/>(needed for logcat)</p>";
theTextView.setText(Html.fromHtml(html).toString().trim());
HTMLタグを処理すると、改行\n
が追加され、場合によっては複数の\n
が互いに続きます。結果は、テキスト間に複数の改行がある文字列になります(特に、HTML文字列に<br/>
タグが含まれている場合)。
次のメソッドは、<br/> tag.
から生じる先頭と末尾の改行を削除します
また、テキスト間の複数の新しい行を減らします(API> 24)。
/**
*
* @param htmlString
* @return Spanned represents the html string removed leading and trailing newlines. Also, reduced newlines resulted from processing HTML tags (for API >24)
*/
public static Spanned processHtmlString(String htmlString){
// remove leading <br/>
while (htmlString.startsWith("<br/>")){
htmlString = htmlString.replaceFirst("<br/>", "");
}
// remove trailing <br/>
while (htmlString.endsWith("<br/>")){
htmlString = htmlString.replaceAll("<br/>$", "");
}
// reduce multiple \n in the processed HTML string
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(htmlString, FROM_HTML_MODE_COMPACT);
}else{
return Html.fromHtml(htmlString);
}
}
<p>
タグを削除して、これを試してください。
String html = "Hi,<br/>Do you think you could get a logcat during the crash? That seems really strange, especially the fact that it makes Android reboot.<br/>You can get the SDK here: http://developer.Android.com/sdk/index.html<br/>(needed for logcat)";
theTextView.setText(Html.fromHtml(html));
それがうまくいくことを願っています。
TextViewの周りのレイアウトは何ですか?私が覚えているのは、一部のレイアウトはコンポーネントの高さの設定を無視し、単にそれを適合させることです。