Android 中微调项中的下标和上标

Subscripts and Superscripts in spinner items in Android

我有一个微调器,它的项目添加在 Java 代码中:

spinnerList = new ArrayList<String>();
spinnerList.add("NO2 - maximum 1-hour concentration");
spinnerList.add("CO - maximum 8-hour concentration");
spinnerList.add("O3 - maximum 8-hour concentration");
spinnerList.add("SO2 - maximum 1-hour concentration");
spinnerList.add("PM2.5  - maximum 24-hour concentration");
spinnerList.add("PM10 - maximum 24-hour concentration");

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinnerList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
firstPageSpinner.setAdapter(dataAdapter);

我想把NO和其他后面的2显示为下标。在其他问题的帮助下,我尝试了这段代码:

...
spinnerList.add(Html.fromHtml("NO<sub>2</sub>") + " - maximum 1-hour concentration");
...

但不幸的是,微调器项目只是 运行 和以前一样!这是微调器的问题吗? - 因为我尝试过的新代码在 TextViews 中完全有效。

*编辑部分:

我将整个自定义布局添加到问题中:

这是包含 Spinner 的 MainActivity xml 文件的一部分:

 <LinearLayout
    android:id="@+id/firstPageFirstLinear"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_above="@+id/firstPageTextView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/first_text_view" />

    <Spinner
        android:id="@+id/firstPageSpinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:dropDownVerticalOffset="25dp"
        android:padding="5dp"
        >
    </Spinner>

</LinearLayout>

这是 custom_spinner_item.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/tvL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="7dp"
    />

</LinearLayout>

这是我的适配器 class :

  public class MyAdapter extends ArrayAdapter {

    public MyAdapter(Context context, int textViewResourceId, ArrayList<CharSequence> objects) {
        super(context, textViewResourceId, objects);
    }

    public View getCustomView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = getLayoutInflater();
        View layout = inflater.inflate(R.layout.custom_spinner_item, parent, false);

        TextView tvL = (TextView) layout.findViewById(R.id.tvL);

        tvL.setText(spinnerList.get(position));
        tvL.setTextColor(Color.BLACK);

        return layout;
    }

    @Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
}

这是MainActivity中onCreate的部分class :

ArrayList<CharSequence> spinnerList;
MyAdapter dataAdapter;

final Spinner firstPageSpinner = (Spinner)findViewById(R.id.firstPageSpinner);

    spinnerList = new ArrayList<CharSequence>();
    spinnerList.add(Html.fromHtml("NO<sub>2</sub>") + "NO2 - maximum 1-hour concentration");
    spinnerList.add("CO - maximum 8-hour concentration");
    spinnerList.add("O3 - maximum 8-hour concentration");
    spinnerList.add("SO2 - maximum 1-hour concentration");
    spinnerList.add("PM2.5  - maximum 24-hour concentration");
    spinnerList.add("PM10 - maximum 24-hour concentration");

    dataAdapter = new MyAdapter(this, R.layout.custom_spinner_item, spinnerList);
    dataAdapter.setDropDownViewResource(R.layout.custom_spinner_item);
    firstPageSpinner.setAdapter(dataAdapter);

它正在 运行像以前一样设置微调器项目。

is this the problem of Spinner ?

这至少部分是您的数据模型的问题。 Html.fromHtml() 不 return 一个 String。它 return 是一个 Spanned 实例,它将包含格式。因为您将 Spanned 填充到 ArrayList<String> 中,所以 Android 在 Spanned 上调用 toString(),消除了格式设置。

把你的ArrayList<String>改成ArrayList<CharSequence>,把你的ArrayAdapter<String>改成ArrayAdapter<CharSequence>,你的运气可能会更好

我有适合您的解决方案,但可能不是最好的。 您可以在您创建的自定义布局中模拟您想要的标签和行为。

假设您在 xml 文件中放置了三个 TextView 而不是那个。然后设置第一个和最后一个字体大小相等,中间一个小一些。

或另一个:用 LinearLayout 替换 TextView,并在适配器中用所需的 TextView 填充它。所以你现在可以设置一个 html 代码作为输入,如果你看到一个子,为它制作一个特殊的 TextView。

我们公司将这样的解决方案称为 "mast mal" 或 "tof mal",我很聪明地找到了这些解决方案。

由于@CommonsWare 帮助了我,我刚刚更改了这部分:

spinnerList.add(Html.fromHtml("NO<sub>2</sub>") + "NO2 - maximum 1-hour concentration");

对此:

spinnerList.add(Html.fromHtml("NO<sub>2</sub> - maximum 1-hour concentration"));

它的工作原理与您在图片中看到的完全一样: