Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I convert a Spannable to a String in android in order to load an ExpandableListView?

I created an array, which I then load into a HashMap, which I then use in an ExpandableListView. However, I'd like to have parts of the data display with subscript and superscript for exponents. After much googling, the solution to superscript and subscript this seems to be using something like this:

text.setText(Html.fromHtml(getString(R.string.acceleration)))

to format using HTML in the string object stored in references. However, this is made to work with TextView or buttons, and not a ListView. The problem is that I realize now that this actually creates a Spannable object, which I have very little knowledge of, but understand it is not a string and so I can't just add it on to the end of a string in my array like I had hoped to. My array looks like this:

constant_common_data = new ListViewItem[]
            {
                    new ListViewItem(R.drawable.star, "Atomic Mass Constant ", "1.660 539 040 e-27", "kg", "0.000 000 020 e-27"),
                    new ListViewItem(R.drawable.star, "Avogadro Constant", "6.022 140 857 e23"," mol^-1", "0.000 000 074 x e23"),
                    new ListViewItem(R.drawable.star, "Boltzmann Constant", "1.380 648 52 e-23", "K^-1", "0.000 000 79 e-23"),
                    new ListViewItem(R.drawable.star, "Conductance Quantum", "7.748 091 7310 e-5", "s","0.000 000 0018 e-5"),
                    new ListViewItem(R.drawable.star, "Electric Constant", "8.854 187 817... e-12", "F m^-1", "(exact)"),

                    new ListViewItem(R.drawable.star, "Electron mass", "9.109 383 56 e-31", "kg", "0.000 000 11 e-31"),
                    new ListViewItem(R.drawable.star, "Electron volt", "1.602 176 6208 e-19"," J", "0.000 000 0098 e-19"),
                    new ListViewItem(R.drawable.star, "Elementary charge ", "1.602 176 6208 e-19", "C", "0.000 000 0098 e-19"),
                    new ListViewItem(R.drawable.star, "Faraday constant ", "96 485.332 89 e-5", "C mol^-1", "0.000 59"),
                    new ListViewItem(R.drawable.star, "Fine-structure constant ", "7.297 352 5664 e-3", "  ", "0.000 000 0017 e-3"),

                    new ListViewItem(R.drawable.star, "Inverse fine-structure constant", "137.035 999 139", "  ", "0.000 000 031"),
                    new ListViewItem(R.drawable.star, "Magnetic constant", "4pi e-7 = 12.566 370 614... e-7"," N A^-2", "(exact)"),
                    new ListViewItem(R.drawable.star, "Magnetic Flux Quantum", "2.067 833 831 e-15", "Wb", "0.000 000 013 e-15"),
                    new ListViewItem(R.drawable.star, "Molar Gas constant", "8.314 4598", "J mol^-1 K^-1", "0.000 0048"),
                    new ListViewItem(R.drawable.star, "Newtonian constant of gravitation ", "6.674 08 e-11", "m^3 kg^-1 s^-2", "0.000 31 e-11"),

                    new ListViewItem(R.drawable.star, "Planck constant", "6.626 070 040 e-34", "J s", "0.000 000 081 e-34"),
                    new ListViewItem(R.drawable.star, "Planck constant over 2 pi", "1.054 571 800 e-34"," J s", "0.000 000 013 e-34"),
                    new ListViewItem(R.drawable.star, "Proton Mass", "1.672 621 898 e-27", "kg", "0.000 000 021 e-27"),
                    new ListViewItem(R.drawable.star, "Proton-Electron Mass Ratio", "1836.152 673 89", "  ", "0.000 000 17"),
                    new ListViewItem(R.drawable.star, "Rydberg constant", "10 973 731.568 508", "m^-1", "0.000 065"),

                    new ListViewItem(R.drawable.star, "Speed of Light in Vacuum", "299 792 458", "m s^-1", "(exact)"),
                    new ListViewItem(R.drawable.star, "Stefan-Boltzmann constant", "5.670 367 e-8", "Wm^-2 K^-4", "0.000 013 e-8"),

                    new ListViewItem(R.drawable.star, "Bohr Radius", "0.529 177 210 67 e-10", "m", "0.000 000 000 12 e-10"),
                    new ListViewItem(R.drawable.star, "Bohr Magneton ", "927.400 9994 e-26"," J T^-1", "0.000 0057 e-26"),
                    new ListViewItem(R.drawable.star, "Josephson constant", "483 597.8525 e9", "Hz V^-1", "0.0030 e9"),
                    new ListViewItem(R.drawable.star, "Von Klitzing constant", "25 812.807 4555", "Ohm", "0.000 0059"),
                    new ListViewItem(R.drawable.star, "Unified Atomic Mass Unit", "1.660 539 040 e-27"+ test , "kg", "0.000 000 020 e-27")
            };}

You can see each ListViewItem takes Strings as parameters, and then later after everything is loaded into the list, I call the toString method of the ListViewItem class shown here:

public String toString() {
        return "Value: " + this.value + "\nUnits:  " + this.unit + "\nStandard Uncertainty:  " + this.uncertainty;
    }

to display in the pull down part of the ExpandableListView. I want the parameters I'm entering into the ListViewItem to be able to beprinted like this, but I also want them to be formatted with sub and super script.

My question is, is there a way to convert a Spannable object to a a String so I can include it in a String parameter and have the object return it, still styled, in it's toString() method?

Thank you, I appreciate all help.

like image 341
grassss Avatar asked Jun 17 '16 17:06

grassss


3 Answers

After searching a lot, I found the following solution:

First, to convert a Spannable to a String object, I used:

 Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);

This method will return a Spannable (of course) and here you can use toString( ) method to generate your String:

String yourString = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString();

If you need to convert a HTML to String (remove the tags) you can use this solution:

  public String stripHtml(String html) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
           return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
        } else {
           return Html.fromHtml(html);
        }    
}
like image 90
Luiz Fernando Salvaterra Avatar answered Nov 13 '22 14:11

Luiz Fernando Salvaterra


If you change ListViewItem constructor to take a CharSequence argument instead of String then you can use either a String or a Spanned (the result of .fromHtml()) as they both extend CharSequence.

like image 38
LukeJanyga Avatar answered Nov 13 '22 15:11

LukeJanyga


You can use the static method toHtml() on the Html class, though that can only handle some HTML output, not arbitrary things. Also, you can use a SpannableStringBuilder to do your changes:

String photoHeading = mContext.getString(R.string.photo_heading);
        SpannableStringBuilder builder = new SpannableStringBuilder(photoHeading);

You could also have an ArrayList that holds the Spannable rather than a String conversion of that Spannable.

like image 3
BrTkCa Avatar answered Nov 13 '22 14:11

BrTkCa