web-dev-qa-db-ja.com

HTMLコンテンツを含むTextViewの追加のパディング

私はこれを持っています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));

その結果、次のようになります。

Resulting screenshot

「譲受人...」は別のTextViewです。
私のTextViewは灰色の背景のものです。その境界は非常に薄い灰色ではっきりと見えます。左側の暗い灰色のバーは背景の一部であるため、TextViewでもあります。

8dpの正方形のパディングがはっきりとわかります。しかし、一番下の空きスペースは何ですか?これはある種のパディングですが、XMLでもコードでも設定していません。

誰かが尋ねた場合、私は必要 HTMLサポートです。上記のスクリーンショットとは異なり、コンテンツにはHTMLコンテンツが含まれている可能性があるためです(<pre><i><b>など)。

33
Benoit Duffez

あなたが見ている余分な「パディング」は、実際には単なる改行とそれに続く別の改行です:

enter image description here

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à、前後:

enter image description here

55
MH.

以下のコードも使用できます

 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;
}
14
Kirtikumar A.

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());
4
Praveena

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);
    }
}
0
Islam Assi

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

それがうまくいくことを願っています。

0
Oam

TextViewの周りのレイアウトは何ですか?私が覚えているのは、一部のレイアウトはコンポーネントの高さの設定を無視し、単にそれを適合させることです。

0
Jeroen Peeters