0

テキストビューがあり、 @ で始まる単語の色を赤色に変更したいのですが、 # の単語もある場合は黒色に変更したいと考えています。テキストはハードコーディングされていません。これを行うにはどうすればよいですか。助けてください。以下のコードで試しましたが、問題は最初の単語にのみ赤い色が適用されることです。

String MsgTitle = Details.get(position).getContent();
                String refString;
                String hashString;
                if (MsgTitle.contains(" ")) {
                    refString = MsgTitle.substring(0,
                            MsgTitle.indexOf(' ')).trim();

                    if (String.valueOf(refString.charAt(0)).equals("@")) {
                        refString = refString.replaceFirst("(^@\\w+)",
                                "<font color='#8A0A0A'>$1</font>");
                    } else {
                        refString = refString.replaceAll("(#\\w+)",
                                "<font color='#000000'><b>$1</b></font>");
                    }

                    hashString = MsgTitle.substring(
                            MsgTitle.indexOf(' ') + 1).trim();
                    ((TextView) vi.findViewById(R.id.textData))
                            .setText(Html.fromHtml(refString
                                    + " "
                                    + hashString
                                            .replaceAll("(#\\w+)",
                                                    "<font color='#000000'><b>$1</b></font>")));
}

私の問題への回答

tring[] str_array = str .split(" ");

            boolean isExists = false;
            for (int i = 0; i < str_array.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (str_array[j].equals(str_array[i])) {
                        isExists = true;
                    }
                }
                if (str_array[i].startsWith("@") && !isExists) {
                    str  = str .replace(str_array[i],
                            "<font color='#8A0A0A'>" + str_array[i]
                                    + "</font>");
                } else if (str_array[i].contains("#")) {
                    str  = str .replaceAll(str_array[i],
                            "<font color='#000000'><b>" + str_array[i]
                                    + "</b></font>");
                }
            }
4

6 に答える 6

0

Html.fromHtml は、peoper html タグを形成して fromHtml を呼び出すことで使用できますが、内部では、メソッドが html を解析し、スパンを作成し、Spannable インターフェイスを使用します。これが実際に試していることです。

于 2013-09-25T10:56:04.290 に答える
0

これを行うには、HTML から文字列をフォーマットします。

String text = "<font color=#ff0000>red text</font> <font color=#00ff00>green color</font>";
tv.setText(Html.fromHtml(text));

取得した @ および # タグからこの HTML テキストを生成するには、コーディングを行う必要がありますが、それほど難しくはありません。

幸運を :)

編集:アルゴリズムを修正する必要があるものがあります。赤いタグを見つけるのに適していますが、他の色にも簡単に拡張できます:

(ちなみに、私はそれをテストしていないので、あちこちにいくつかの不具合があるかもしれません...あなたがそれらを解決できることを願っています:P)

String text = "lalala @red lalala";
        int indexForRed = text.indexOf("@");
        int indexForSpace = -1;
        String redText;
        String beforeRedText;
        String afterRedText;


        while (indexForRed != -1)
        {
            indexForSpace = text.indexOf(" ", indexForRed);
            redText = text.substring(indexForRed + 1, indexForSpace);           
            beforeRedText = indexForRed > 0 ? text.substring(0, indexForRed - 1) : "";
            afterRedText = indexForSpace < text.length() - 1 ? text.substring(indexForSpace + 1, text.length()) : "";

            text = beforeRedText + "<font color=\"#ff0000\">" + redText + "</font>" + afterRedText;         

            indexForRed = text.indexOf("@", text.indexOf("</font>", indexForSpace));
        }
tv.setText(Html.fromHtml(text));

また、# はフォントの色を指定するために使用され、アルゴリズム全体を混同する可能性があるため、他の色に別の分母を使用することを検討することもできます (#... 多分 $,%,^ の代わりに)。# を使用する必要がある場合は、@ を検索する前に必ず # を検索してください。問題なく動作するはずです。

お役に立てれば :)

于 2013-09-25T10:42:48.447 に答える