web-dev-qa-db-ja.com

ExpandableListViewをロードするために、AndroidでSpannableを文字列に変換できますか?

配列を作成し、それをHashMapにロードして、ExpandableListViewで使用します。ただし、データの一部を指数の添え字と上付き文字で表示したいと思います。多くのグーグルの後、これを上付き文字と下付き文字にする解決策は、次のようなものを使用しているようです。

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

参照に格納されている文字列オブジェクトでHTMLを使用してフォーマットします。ただし、これは、ListViewではなく、TextViewまたはボタンで機能するように作成されています。問題は、これが実際にSpannableオブジェクトを作成することに気付いたことです。これは私がほとんど知らないのですが、それは文字列ではないことを理解しているので、配列の文字列の最後に追加することはできません。私は望んでいた。私の配列は次のようになります:

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

各ListViewItemがStringsをパラメーターとして受け取ることがわかります。その後、すべてがリストにロードされた後、次に示すListViewItemクラスのtoStringメソッドを呼び出します。

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

expandableListViewのプルダウン部分に表示します。 ListViewItemに入力するパラメーターをこのように印刷できるようにしたいのですが、サブスクリプトとスーパースクリプトでフォーマットすることも必要です。

私の質問は、SpannableオブジェクトをStringに変換して、それをStringパラメーターに含め、オブジェクトがtoString()メソッドでスタイルを設定したまま返すようにする方法はありますか?

ありがとう、私はすべての助けに感謝します。

12
grassss

たくさん検索した後、私は次の解決策を見つけました:

まず、SpannableStringオブジェクトに変換するために、次のものを使用しました。

_ Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
_

このメソッドは(もちろん)Spannableを返します。ここでは、toString( )メソッドを使用してStringを生成できます。

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

HTMLStringに変換する(タグを削除する)必要がある場合は、次のソリューションを使用できます。

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

ListViewItemコンストラクターを変更してCharSequenceではなくString引数を取る場合は、StringまたはSpannedのいずれかを使用できます(両方ともCharSequenceを拡張するため、.fromHtml())の結果。

4
LukeJanyga

Htmlクラスで静的メソッドtoHtml()を使用できますが、それは一部のHTML出力のみを処理でき、任意のものは処理できません。また、SpannableStringBuilderを使用して変更を行うことができます。

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

また、そのArrayListSpannable変換ではなく、Stringを保持するSpannableを持つこともできます。

3
Lucas Costa