javaandroidhtmlcolorsfromhtml

How to convert HTML String with RGB colors to HTML String with HEX colors in Android JAVA


I've the following html text (Exemple) :

<p>​<span style="color: rgb(33, 150, 243);">This is a <span style="background-color: rgb(255, 235, 59);">test !!</span></span></p>

I'm trying to display this text in a TextView.

textview.setText(Html.fromHtml(string));

It works, but display no colors.

For this to work, I have to convert the text in this form (with HEX colors)

<p>​<span style="color: #2196f3;">This is a <span style="background-color: #ffeb3b;">test !!</span></span></p>

How can I doi it?

I can not find the solution ... Has anyone ever had this problem and can help me?

Thanks in advance !


Solution

  • Explanation in comments:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Stackoverflow52173062 {
    
        public static void main(final String[] args) {
    
            String html = "<p>​<span style=\"color: rgb(33, 150, 243);\">This is a <span style=\"background-color: rgb(255, 235, 59);\">test !!</span></span></p>";
    
            html = replaceRGBColorsWithHex(html);
    
            // final String
            System.out.println(html);
        }
    
        private static String replaceRGBColorsWithHex(String html) {
            // using regular expression to find all occurences of rgb(a,b,c) using
            // capturing groups to get separate numbers.
            Pattern p = Pattern.compile("(rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))");
            Matcher m = p.matcher(html);
    
            while (m.find()) {
                // get whole matched rgb(a,b,c) text
                String foundRGBColor = m.group(1);
                System.out.println("Found: " + foundRGBColor);
    
                // get r value
                String rString = m.group(2);
                // get g value
                String gString = m.group(3);
                // get b value
                String bString = m.group(4);
    
                System.out.println(" separated r value: " + rString);
                System.out.println(" separated g value: " + gString);
                System.out.println(" separated b value: " + bString);
    
                // converting numbers from string to int
                int rInt = Integer.parseInt(rString);
                int gInt = Integer.parseInt(gString);
                int bInt = Integer.parseInt(bString);
    
                // converting int to hex value
                String rHex = Integer.toHexString(rInt);
                String gHex = Integer.toHexString(gInt);
                String bHex = Integer.toHexString(bInt);
    
                // add leading zero if number is small to avoid converting
                // rgb(1,2,3) to rgb(#123)
                String rHexFormatted = String.format("%2s", rHex).replace(" ", "0");
                String gHexFormatted = String.format("%2s", gHex).replace(" ", "0");
                String bHexFormatted = String.format("%2s", bHex).replace(" ", "0");
    
                System.out.println(" converted " + rString + " to hex: " + rHexFormatted);
                System.out.println(" converted " + gString + " to hex: " + gHexFormatted);
                System.out.println(" converted " + bString + " to hex:" + bHexFormatted);
    
                // concatenate new color in hex
                String hexColorString = "#" + rHexFormatted + gHexFormatted + bHexFormatted ;
    
                System.out.println("  replacing " + foundRGBColor + " with " + hexColorString);
                html = html.replaceAll(Pattern.quote(foundRGBColor), hexColorString);
            }
            return html;
        }
    }