8

私のアプリでは、Html.fromHtml(string).toString メソッドを使用して、<p>JSON を解析するときに受け取ったタグをいくつか削除します。

タグを付けたままにする<p>と、テキストは背景に完全にフィットします (背景は、高さと幅の両方に wrap_content を使用した相対的なレイアウトです)。ただし、fromHtml を使用して<p>タグを削除すると、テキストの下に突然大きなスペースができてしまいます。 fromHtml メソッドが最後にスペースを追加していると思いますか?

何か案は?

編集:

ここにスクリーンショットがあります: http://imgur.com/a/zIZNo

タグ付き<p>のものは、明らかに fromHtml を使用していないものです! :)

編集 2: 解決策が見つかりました。以下の私の回答を参照してください。追加された隠し要素について教えてくれた Andro Selva に感謝します/n!

4

5 に答える 5

13

解決策が見つかりました:

fromHtml は Spanned 型を返します。そこで、返されたものを変数に割り当て、それを文字列に変換してから、.trim() メソッドを使用しました。

最後にすべての空白を削除しました。

于 2012-08-09T11:59:20.107 に答える
5

はい、あなたが考えたことは本当に正しいです。下部にスペースを追加します。しかしその前に、これがどのように機能するかを説明させてください。

それがどのように機能するかを確認するには、HTML クラスを確認する必要があります。

簡単に言うと、これがどのように機能するかです:Htmlクラスが<p>タグを見るたびに、2 つの "\n" 文字を末尾に追加するだけです。

この場合、下部に表示される空のスペースは、実際にはパラグラフの最後に追加された 2 つの \n が原因です。

そして、このアクションを担当する Html クラスの実際のメソッドを追加しました。

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

    }
}

このアクションをオーバーライドしたい場合は、Html クラス自体をオーバーライドする必要がありますが、これは少しトリッキーで、ここでは完了できません。

編集

ここにHtmlクラスへのリンクがあります、

HTML クラス

于 2012-08-09T11:44:31.400 に答える
3

オブジェクトで使用しようとしている場合、または特定の場所に合わせようとしている場合は、タグの代わりにタグを使用して<a>みてください。スタイルを維持できる<p><p>\n<b>

于 2015-11-13T17:59:10.287 に答える
0

@Andro Selva による説明は正しく、それについてやるべきことはあまりありません。イライラすることに、呼び出しにフラグを含めることで、API 24 以降では状況が改善されます。

Spanned fromHtml (String source, 
                int flags, 
                Html.ImageGetter imageGetter, 
                Html.TagHandler tagHandler);

FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPHフラグは、標準の段落終了の二重の「\n\n」を、改行の単一の「\n」のそれに減らすと思います

Android バージョンの歴史を考えると、Android API 24+ 専用のソフトウェアを作成する余裕はありません。だから...私は2つの追加のカスタムタグを含むクラッジソリューションを見つけました。

1. <scale factor="x.xx">... </scale>
2. <default>... </default>

両方とも、このメソッドを介して RelativeSizeSpan クラスを呼び出します

private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) {
                int len = output.length();
                if (opening) {
                    System.out.println("scalefactor open: " + scalefactor);
                    output.setSpan(new RelativeSizeSpan(scalefactor), len, len,
                            Spannable.SPAN_MARK_MARK);
                } else {
                    Object obj = getLast(output, RelativeSizeSpan.class);
                    int where = output.getSpanStart(obj);
                    scalefactor = ((RelativeSizeSpan)obj).getSizeChange();
                    output.removeSpan(obj);
                    System.out.println("scalefactor close: " + scalefactor);
                    if (where != len) {
                        output.setSpan(new RelativeSizeSpan(scalefactor), where, len,
                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }
                }
            }

Html.fromHtmlこれは、メソッドに提供されたカスタム TagHandler から呼び出されます。

private static class CustomTagHandler implements Html.TagHandler {

    private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) {
            int len = output.length();
            if (opening) {
                //mSizeStack.push(scalefactor);
                System.out.println("scalefactor open: " + scalefactor);
                output.setSpan(new RelativeSizeSpan(scalefactor), len, len,
                        Spannable.SPAN_MARK_MARK);
            } else {
                Object obj = getLast(output, RelativeSizeSpan.class);
                int where = output.getSpanStart(obj);
                scalefactor = ((RelativeSizeSpan)obj).getSizeChange();

                output.removeSpan(obj);

                //scalefactor = (float)mSizeStack.pop();
                System.out.println("scalefactor close: " + scalefactor);
                if (where != len) {
                    output.setSpan(new RelativeSizeSpan(scalefactor), where, len,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
...
        final HashMap<String, String> mAttributes = new HashMap<>();

        @Override
        public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
            String Attr;
            processAttributes(xmlReader);
            if ("default".equalsIgnoreCase(tag)) {
                ProcessRelativeSizeTag(mDefaultTextSize, opening, output);
                return;
            }

            if ("scale".equalsIgnoreCase(tag)) {
                Attr = mAttributes.get("factor");
                if (Attr != null && !Attr.isEmpty()) {
                    float factor = parseFloat(Attr);
                    if (factor > 0)
                        ProcessRelativeSizeTag(factor, opening, output);
                }
                return;
... 
            }

       }

使用するために、オブジェクトのテキスト サイズを 1 に設定しますTextview。つまり、1 ピクセルです。次に、必要な実際のテキスト サイズを変数に設定しますmDefaultTextSizehtmlTextView次のように拡張するすべての Html 機能を内部に持っていますTextView

public class htmlTextView extends AppCompatTextView {
    static Typeface mLogo;
    static Typeface mGAMZ;
    static Typeface mBrush;
    static Typeface mStandard;
    int GS_PAINTFLAGS = FILTER_BITMAP_FLAG | ANTI_ALIAS_FLAG | SUBPIXEL_TEXT_FLAG | HINTING_ON;
    static float mDefaultTextSize;
    static Typeface mDefaultTypeface;
etc

}

public メソッドを含む

public void setDefaultTextMetrics(String face, float defaultTextSize) {
        mDefaultTypeface = mStandard;
        if (face != null) {
            if ("gamz".equalsIgnoreCase(face)) {
                mDefaultTypeface = mGAMZ;
            } else {
                if ("brush".equalsIgnoreCase(face)) {
                    mDefaultTypeface = mBrush;
                }
            }
        }
        setTypeface(mDefaultTypeface);
        setTextSize(1);
        mDefaultTextSize = defaultTextSize;
    }

簡単な((htmlTextView)tv).setDefaultTextMetrics(null, 30);呼び出しでhtmlTextView、標準の書体をテキスト サイズ 30 でデフォルトとして使用するように my を設定します。

次に、fromHtml で使用するこの例を与えると、次のようになります。

<string name="htmlqwert">
<![CDATA[
        <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
        <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
        <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
        <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p>
]]>
</string>

カスタム タグ<box>を使用すると、テキストの背景を強調表示できます。添付の図を参照してください。テキスト サイズが 1 に設定されたタグと 30 倍で aを呼び出す<default>タグを使用した 1 つの結果と、次の結果が示されています。TextView<default>RelevantSizeSpan

<string name="htmlqwert">
    <![CDATA[
            <p><scale factor="1.5"><box> qwertQWERT </box></scale></p>
            <p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
            <p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
            <p><scale factor="1.5"><box>qwertQWERT</box></scale></p>
    ]]>
    </string>

<default>タグを使用せず、TextView代わりにテキスト サイズを 30 に設定します。最初のケースでは、余分な新しい行がまだ残っていますが、高さは 1 ピクセルしかありません!

NB<scale factor="1.5">...</scale>タグには本当の意味はありません。それらは、他のテストからのアーティファクトが残っているだけです。

結果:以下の両方の例では、段落間に 2 つの改行がありますが、左側の例では、それらの行の 1 つが高さ 1 ピクセルしかありません。ゼロに減らす方法を理解するために読者に任せますが、テキストサイズを 0 にしないでください。

于 2017-08-04T17:25:58.397 に答える