尝试使用适配器自定义微调器

时间:2012-10-21 18:23:55

标签: android spinner android-arrayadapter

我想做的只是更改我的微调器文本的字体字体和大小。

我做了一些初步尝试。什么都没有崩溃,但我的旋转器是空白的。 (我还没有实现自定义字体,我只是想让微调器先工作。

在代码中:

protected SpinnerSortAdapter sAdapter;
    protected Spinner sort;
    protected String[] strings;

        sort = (Spinner) getActivity().findViewById(R.id.spinner2);
        strings = getActivity().getResources().getStringArray(R.array.sorting_items);
        SpinnerSortAdapter sAdapter = new SpinnerSortAdapter(getActivity(),
                android.R.layout.simple_spinner_item, strings);
        sAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sort.setAdapter(sAdapter);
        sort.setOnItemSelectedListener(new MyOnItemSelectedListener());

适配器:

public class SpinnerSortAdapter extends ArrayAdapter<String> {
public SpinnerSortAdapter(Context context, int textViewResourceId,
        String[] strings) {
    super(context, textViewResourceId, strings);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if (view instanceof TextView) {
        ((TextView) view).setTextSize(5);
    }
    return view;
}

public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View row = super.getView(position, convertView, parent);
    return (row);
}

} enter code here

2 个答案:

答案 0 :(得分:8)

您没有正确初始化适配器。您的ArrayAdapter版本需要两个整数,一个指向行的布局文件,一个int表示该布局文件中TextView小部件的id。此适配器将为空。你的代码应该是这样的:

String[] items = getResources().getStringArray(R.array.sorting_items);
SpinnerSortAdapter adapter = new SpinnerSortAdapter(getActivity(), android.R.layout.simple_spinner_item, items);

此外,适配器将更改为:

 public class SpinnerSortAdapter extends ArrayAdapter<String> {

    public SpinnerSortAdapter(Context context, int textViewResourceId,
            String[] strings) {
        super(context, textViewResourceId, strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (view instanceof TextView) {
            ((TextView) view).setTextSize(5);
        }
        return view;
    }

    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View row = super.getView(position, convertView, parent);
        return (row);
    }
}

答案 1 :(得分:2)

更简单,更快捷的方法是自定义传递给适配器的布局而不是适配器本身:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.layout.spinner_item, R.array.sorting_items);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);

将此保存为spinner_dropdown_item.xml中的res/layout

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:ellipsize="marquee" 
    android:textSize="15sp"/>

(我刚刚复制了simple_spinner_dropdown_item.xml并在底部添加了textSize属性。您应该对simple_spinner_item布局执行相同操作。)

这种方法更快,因为您没有在运行时更改任何属性。 XML已预处理。每次拨打getView()getDropDownView()时,自定义适配器都会更改字体和大小......