如何在ColorStateList中获取“state_enabled”以在Spinner中工作?

时间:2012-11-28 15:11:17

标签: android

我觉得我错过了一些明显的东西,但我有一个名为“voices_spinner_white_text_color_states”的ColorStateList,见下文:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    android:state_enabled="false"
    android:color="@color/color_white_light_alpha" />

<item 
    android:state_enabled="true"
    android:color="@color/color_white" />
</selector>

我在我的SpinnerAdapter中引用了这样的内容:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View item;

    if( convertView != null ){
        item = (GenericSpinnerItem)convertView;
    } else {
        item = new GenericSpinnerItem( context, false );
        ((GenericSpinnerItem)item ).valueText.setTextColor( context.getResources().getColorStateList(R.drawable.voices_spinner_white_text_color_states) );
        AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams( LayoutParams.MATCH_PARENT, M.dp(30));
        item.setLayoutParams(layoutParams);
    }

    ( (GenericSpinnerItem)item ).setup(values.get(position));

    return item;
}

我希望我打电话时

spinner.setEnabled( false )

微调器的文本将显示禁用状态。它显示启用状态就好了,但是当我将微调器的启用状态更改为false时,它根本不显示禁用状态。

事实上,为了测试,如果我将“android:state_enabled =”false“更改为”android:state_enabled =“ true ”,就像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    android:state_enabled="true"
    android:color="@color/color_white_light_alpha" />

<item 
    android:state_enabled="true"
    android:color="@color/color_white" />
</selector>

显示“禁用状态”。不知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

[由于我无法评论你的问题,我会写一个答案。]

我经历过完全相同的事情。

有趣的是,可以成功启用和禁用TextView对象,并在它们独立时适当地对此设置作出反应。

我此时的假设是,Spinner根本不会(至少)将其启用状态(更改)传播到其子(ren),特别是TextView。

我认为这是一个错误或设计缺陷,因为它(不必要地)限制了人们可以改变旋转器外观的方式,仅举一个方面。

当然,可以将Spinner子类化并将(至少)此事件传递给TextView。但是,我不会认为这是一个干净的解决方案,除非有人能指出Spinner在这方面符合Android的基本设计原则,这样行为就不会改变。

[更新21012-Dec 7]

另外两项(意外)调查结果。

首先,关于 android:addStatesFromChildren ,请参阅下面的评论。

其次, android:disableChildrenWhenDisabled 显然是针对Holo风格引入的,因为如果没有该功能,Holo Spinners看起来不会很好,请参阅https://android.googlesource.com/platform/frameworks/base/+/42b7e99b11a5ab1cbc0beebe0b15e46bdf462dff%5E!/。尽管用词不当,如果设置为true,Spinner应该将其启用状态( true false,即它)传播给其子项。

据推测,使用你的应用程序将Holo(或更高版本)主题设置为true,如果你定位较旧的主题(分别是Android版本),它应该是假的(不存在)。

目前看来,在Eclipse中显式处理这个属性可能会有问题,因为它在Eclipse插件中添加了相当晚的内容,请参阅https://android.googlesource.com/platform/sdk/+/8381e23ec6d557059d15c73ea313d8324359f762%5E2..8381e23ec6d557059d15c73ea313d8324359f762/

换句话说,当一个人开发支持Holo的设备或更高版本时,人们可以期望Spinners将其启用状态传播给他们的孩子。由于Android 2设备至今仍在销售并占有一定的市场份额,因此在许多情况下,人们将不得不使用旧的Spinners,它们无法正常运行。