我可以在 android 中将 Spannable 转换为 String 以加载 ExpandableListView 吗?
Posted
技术标签:
【中文标题】我可以在 android 中将 Spannable 转换为 String 以加载 ExpandableListView 吗?【英文标题】:Can I convert a Spannable to a String in android in order to load an ExpandableListView? 【发布时间】:2016-10-19 15:25:34 【问题描述】:我创建了一个数组,然后将其加载到 HashMap 中,然后在 ExpandableListView 中使用它。但是,我希望部分数据显示为指数的下标和上标。经过多次谷歌搜索,上标和下标的解决方案似乎使用了这样的东西:
text.setText(html.fromHtml(getString(R.string.acceleration)))
使用 HTML 格式化存储在引用中的字符串对象。但是,这适用于 TextView 或按钮,而不是 ListView。问题是我现在意识到这实际上创建了一个 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() 方法中返回它,仍然有样式?
谢谢你,感谢所有帮助。
【问题讨论】:
您是否正在为您的列表项使用带有自定义布局的自定义列表适配器?如果没有,那是简单的解决方案。您只需定义一个自定义列表项,该列表项允许您在列表项中显示您想要的任何特殊图形。你不想使用像ArrayAdapter
这样的东西,因为它只允许一个文本项。
好吧,如果你已经有一个自定义的BaseAdapter
或类似的东西,这应该相当简单,不需要很多额外的工作。如果您不确定如何进行,请随时发布您的适配器代码,我会看一下,也许会为您指明正确的方向。
【参考方案1】:
搜索了很多,找到了如下解决方案:
首先,将Spannable
转换为String
对象,我使用了:
Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
这个方法会返回一个Spannable
(当然),在这里你可以使用toString( )
方法来生成你的String
:
String yourString = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString();
如果您需要将HTML
转换为String
(删除标签),您可以使用此解决方案:
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);
【讨论】:
【参考方案2】:如果您将ListViewItem
构造函数更改为采用CharSequence
参数而不是String
,那么您可以使用String
或Spanned
(.fromHtml()
的结果),因为它们都扩展了@987654327 @。
【讨论】:
问题是关于将 Spannable 转换为 String,而不是更改构造函数。我不想使用 CharSequence,只有字符串。 但将其转换为 String 不会保留格式 - String 不会保留 Spans【参考方案3】:您可以在Html
类上使用静态方法toHtml()
,尽管它只能处理一些HTML
输出,不能处理任意事情。
此外,您可以使用 SpannableStringBuilder 进行更改:
String photoHeading = mContext.getString(R.string.photo_heading);
SpannableStringBuilder builder = new SpannableStringBuilder(photoHeading);
您还可以拥有一个包含Spannable
的ArrayList
,而不是该Spannable
的String
转换。
【讨论】:
以上是关于我可以在 android 中将 Spannable 转换为 String 以加载 ExpandableListView 吗?的主要内容,如果未能解决你的问题,请参考以下文章
Android 自定义 View 中使用 Spannable
什么是Objective-C中Android的“Spannable”等价物
java [Spannable String] #android_snippet #android