1

我觉得我错过了一些明显的东西,但我有这个名为“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>

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

4

1 回答 1

1

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

我经历过完全一样的。

有趣的是,TextView 对象可以成功地启用和禁用,并在它们自己时对这个设置做出适当的反应。

我此时的假设是 Spinner 根本不会(至少)将其启用状态(更改)传播到其子(ren),在这种情况下尤其是 TextView。

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

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

[21012 年 12 月 7 日更新]

还有两个(意外)发现。

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

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

据推测,使用您的应用程序定位 Holo(或更高版本)主题会将其设置为 true,而如果您定位较旧的主题(相应的 Android 版本),它应该是 false(相应的不存在)。

目前看来,在 Eclipse 中明确处理此属性可能会出现问题,因为在 Eclipse 插件中添加它的时间相当晚,请参阅https://android.googlesource.com/platform/sdk/+/8381e23ec6d557059d15c73ea313d8324359f762% 5E2..8381e23ec6d557059d15c73ea313d8324359f762/

换句话说,当一个人为启用 Holo 或更高版本的设备进行开发时,可以期望 Spinner 将其启用状态传播给他们的孩子。到今天为止,Android 2 设备仍在销售并占有一定的市场份额,在许多情况下,人们将不得不使用开箱即用的旧版 Spinner。

于 2012-12-04T12:01:19.037 回答