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"));
它的工作原理与您在图片中看到的完全一样:
我有一个微调器,它的项目添加在 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"));
它的工作原理与您在图片中看到的完全一样: