6

我正在使用内置资源 ID android.R.layout.simple_spinner_dropdown_item 创建一个 SpinnerAdapter

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item);

但是该资源 ID 创建的 textView 具有 textColor Black,我需要不同的颜色。改变颜色但保持其他一切不变的最佳方法是什么?

当我尝试在 xml 文件中创建自己的 textView 布局资源时,例如

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/White"
    />

那么它的行为方式与 android.R.layout.simple_spinner_dropdown_item 不同,因为例如填充不同。所以

  1. 有没有办法在继承 android.R.layout.simple_spinner_dropdown_item 的所有内容并允许我覆盖 textColor 的 xml 文件中创建我自己的布局资源?
  2. 或者 android.R.layout.simple_spinner_dropdown_item 的完整定义在某处可用?
  3. 或者也许有更简单的方法?

这个问题与我今天提出的另一个问题有关(Can't change the text color with Android Action Bar drop-down navigation)。我已经意识到这个问题(以及这个问题)的一个答案是创建我自己的ArrayAdapter继承自的类,ArrayAdapter<T>这样我就可以在使用 ArrayAdapter 时始终在代码中设置颜色(请参阅我对该问题的回答)。但这似乎是一个非常麻烦的解决方案:-|。

更改文本颜色不应该是一项艰巨的任务!

4

3 回答 3

9

要扩展 Sam 的解决方案,您需要以非常具体的方式修改文件以覆盖 Android 的样式。

将 sdk 文件夹中的文件复制simple_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="match_parent"
android:layout_height="?android:attr/dropdownListPreferredItemHeight"
android:ellipsize="marquee" />

为了更改 TextView 的背景并避免此错误:

.../res/layout/simple_spinner_dropdown_item.xml:20:错误:错误:属性不公开。(在 'layout_height' 处,值为 '?android:attr/dropdownListPreferredItemHeight')。

您的代码需要如下所示:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/spinnerText"
style="@style/SpinnerTextViewItem"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee" />

需要进行的另一个主要更改是创建自己的样式。您可能有一个 styles.xml 文件,因此添加一个类似于此的新样式:

<style name="SpinnerTextViewItem" parent="@android:style/Widget.TextView" >
    <item name="android:textStyle">normal</item>
    <item name="android:background">@color/green</item>
</style>

假设您的 colors.xml 文件中有一些内容,您可以通过“@color/green”或您选择的任何颜色(当然您可以使用@android:color/...)设置颜色,更不用说所有其他项目了您可以添加以更改 TextView。

于 2013-07-11T22:11:37.450 回答
9

有没有办法在继承 android.R.layout.simple_spinner_dropdown_item 的所有内容并允许我覆盖 textColor 的 xml 文件中创建我自己的布局资源?

不,但您可以将您喜欢的版本剪切并粘贴simple_spinner_dropdown_item.xml到新文件中,然后只需更改文本颜色。

或者 android.R.layout.simple_spinner_dropdown_item 的完整定义在某处可用?

是的,但有许多不同的版本。你喜欢哪个 API?此外,您的硬盘驱动器上可能已经有一个副本,请检查<android-sdk>/platforms/android-xx/data/res/layout/xx特定的 API 在哪里。)


作为替代方法,您可以创建自定义适配器并在为每一行充气后更改文本颜色,但上述方法会稍微快一些,因为它不涉及任何运行时更改。

于 2013-04-11T18:11:36.063 回答
0

不使用自定义适配器是不可能改变颜色的

 android.R.layout.simple_spinner_dropdown_item

最好创建一个自定义适配器,然后您可以更改颜色、testSixe、textStyle 等。

于 2013-04-11T18:36:54.773 回答