3

无法让我的微调器填充。好吧,我用strings.xml中的字符串数组填充它就好了,但现在我想向数组中添加一个自定义字体。我第一次使用自定义 ArrayAdapter,它在其布局 xml 中覆盖了我的“android:entries=”和“android:prompt=”。

所以,我需要用我的 strings.xml 中的一个数组填充这个微调器

(在 onCreate 内)

    spinner1 = (Spinner) findViewById(R.id.distancespinner);
    MyArrayAdapter ma = new MyArrayAdapter(this, R.layout.my_spinner_style);
    spinner1.setAdapter(ma);

然后:

 private class MyArrayAdapter extends ArrayAdapter {

    Typeface font = Typeface.createFromAsset(getAssets(), "fonts/m01.TTF");  

    public MyArrayAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    }

    public TextView getView(int position, View convertView, ViewGroup parent) {
    TextView v = (TextView) super.getView(position, convertView, parent);
    v.setTypeface(font);
    return v;
    }

    public TextView getDropDownView(int position, View convertView, ViewGroup parent) {
    TextView v = (TextView) super.getView(position, convertView, parent);
    v.setTypeface(font);
    return v;
    }

    }

我尝试在 my_spinner_style.xml 中添加条目并再次提示...

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/location_arrays"
android:prompt="@string/location_prompt"
android:singleLine="True" />

但是,这也行不通。

4

3 回答 3

3

也许这有点晚了。在我实现了你的代码和一些额外的测试之后,我想我终于得到了答案。微调器未填充的关键问题是:

您在 xml 文件中设置微调器的条目,但以编程方式将其替换为 EMPTY 适配器。

我尝试了以下方法来使用不同的结果填充微调器:

  1. 在没有任何适配器的情况下设置 xml 中的条目。

    <Spinner 
    android:id="@+id/simple_spinner2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/simpleStringArray"
    android:prompt="@string/simplePrompt"/>
    

    它使用正确的内容填充微调器,而无需任何其他样式。

  2. 在 xml 中设置条目,并将另一个适配器设置为微调器(就像您在问题中所做的那样)

    在 .xml 中

    <Spinner 
    android:id="@+id/simple_spinner2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/simpleStringArray"
    android:prompt="@string/simplePrompt"/>
    

    在.java中:

    Spinner mySpinner2 = (Spinner) findViewById(R.id.simple_spinner2);
    MySpinnerAdapter2 spinnerAdapter2 = new MySpinnerAdapter2(this, R.layout.simple_list_item);
    

    它显示一个空的微调器。

  3. 以编程方式将数据设置为适配器

    在 .xml 中

    在.java setContentView(R.layout.activity_spinner);

    Spinner mySpinner2 = (Spinner) findViewById(R.id.simple_spinner2);
    MySpinnerAdapter2 spinnerAdapter2 = new MySpinnerAdapter2(this, R.layout.simple_list_item);
    spinnerAdapter2.addAll(items2);
    

    私有类 MySpinnerAdapter2 扩展 ArrayAdapter {

    public MySpinnerAdapter2(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView v = (TextView) super.getView(position, convertView, parent);
        v.setTextColor(Color.BLUE);
        return v;
    }
    
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        Typeface myFont = Typeface.createFromAsset(getAssets(), "fonts/Igualb.ttf");
        TextView v = (TextView) super.getDropDownView(position, convertView, parent);
        v.setTextColor(Color.RED);
        v.setTypeface(myFont);
        return v;
    }
    

它使用 cumtom-set 字体正确显示内容。

如果您愿意,可以在此 github 存储库中检查完整的项目。

希望这有帮助。

于 2013-09-25T04:35:11.587 回答
1

那是我重写的代码,它工作正常:

Spinner spinner = (Spinner) findViewById(R.id.distancespinner);
spinner.setPromptId(R.string.location_prompt);
MyArrayAdapter ma = new MyArrayAdapter(this, R.layout.my_spinner_style);
ma.addAll(Arrays.asList(getResources().getStringArray(
        R.array.location_arrays)));
spinner.setAdapter(ma);

和 XML

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="True" />

Adapter是一样的。

于 2013-09-25T03:14:50.100 回答
0

可能是下面的行不正确

Typeface font = Typeface.createFromAsset(getAssets(), "fonts/m01.TTF");

m01.TTF是错误的改变m01.ttf

Typeface font = Typeface.createFromAsset(getAssets(), "fonts/m01.ttf");
于 2013-09-20T05:11:37.650 回答