【问题标题】:Attempting to customize spinner with adapter尝试使用适配器自定义微调器
【发布时间】:2012-10-22 02:57:29
【问题描述】:

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

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

在代码中:

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

【问题讨论】:

  • 为什么不使用[Spin​​nerAdapter][1]? [1]:developer.android.com/reference/android/widget/…
  • my spinner is blank 是什么意思?如果要更改微调器对话框中的文本,则必须实现 getDropdownView
  • 主要是因为我看到的大部分教程都使用了ArrayAdapter。我当然会使用任何有效的方法!
  • @Luksprog 它是空白的,因为在我的字符串数组中没有填充它。
  • 您使用了错误的ArrayAdapter 超级类。你不能传递这样的数组。现在你正在实现 ArrayAdapter,它需要两个整数,一个布局文件和一个来自该布局的 TextView 的 ID(但你为数组提供了一个 ID?!?)所以适配器是空的。

标签: android spinner android-arrayadapter


【解决方案1】:

您没有正确初始化适配器。您的ArrayAdapter 版本需要两个整数,一个指向该行的布局文件,一个整数代表该布局文件中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);
    }
}

【讨论】:

  • 它一直告诉我删除 items 以匹配(上下文,int)
  • 我给了你一个upvote,因为你提醒我在创建适配器时使用ArrayAadapter.createFromResource()(作为另一种方式)正确使用R.array.name
  • @Luksprog 代码更有意义,但我仍然在微调器中得到一个空白列表。我将再次更新我的代码...
  • @KickingLettuce 实现自定义字体大小和字体应该不是问题(只需使用您在这些方法中获得的视图)。如果您使用这些布局文件,也不需要进行 instanceof 检查,因为它们是 TextViews
  • 谢谢,其实我之前已经实现了字体。只是没有 Spinners。实际上,除了默认微调器之外,从未使用过任何东西。也感谢关于 instanceof 的提醒。我会删除它。
【解决方案2】:

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

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

res/layout 中将其另存为spinner_dropdown_item.xml

<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() 时自定义适配器都会更改字体和大小...

【讨论】:

  • 看起来很简单,但是自定义字体呢?
  • 使用fontFamily 属性。如果您查看TextView's documentation,您会发现一个表格列出了每个 XML 属性及其对应的方法。
  • 谢谢山姆。我考虑过使用相同的createFromResources 方法,但是您不能在普通TextView 上的xml 中设置自定义字体(我可能弄错了,但fontFamily 不适合这个)。
  • @Luksprog 感谢您的提醒,我之前没有使用过自定义字体,我只是依赖文档。 setTypeface() 列出了一个属性 typeface(等等)。希望其中之一应该适用于自定义字体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多