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オブジェクトは、単独で有効または無効にでき、この設定に適切に反応します。

この時点での私の仮定は、スピナーが(少なくとも)その有効な状態(変更)をその子(この場合は特にTextView)に単純に伝播しないということです。

これはバグまたは設計上の欠陥だと思います。これは、スピナーの外観を箱から出して変更する方法を(不必要に)制限するためです。

もちろん、Spinnerをサブクラス化して、(少なくとも)このイベントをTextViewに配信することもできます。ただし、動作が変更されないように、SpinnerがAndroidの基本的な設計原則に準拠していることを誰かが指摘できない限り、クリーンなソリューションとは見なしません。

[更新21012-12月7日]

さらに2つの(偶発的な)調査結果。

まず、android:addStatesFromChildrenについては、以下の私のコメントを参照してください。

次に、android:disableChildrenWhenDisabledがHoloスタイルに導入されました。これは、Holo Spinnersがこの機能なしでは見栄えが良くないためです。https://android.googlesource.com/platform/frameworks/base/+/42b7e99b11a5ab1cbc0beebe0b15e46bdf462dff%5E!/を参照してください。誤称にもかかわらず、trueに設定されている場合、スピナーはその有効な状態(truefalseの両方)を子に伝播することになっています。

おそらく、アプリケーションでHolo(またはそれ以降)のテーマをターゲットにすると、これはtrueに設定されますが、古いテーマ(またはAndroidリリース)をターゲットにすると、false(または存在しない)になります。

現時点では、Eclipseプラグインでの追加がかなり遅いため、Eclipseでこの属性を明示的に処理すると問題が発生する可能性があります。https://android.googlesource.com/platform/sdk/+/8381e23ec6d557059d15c73ea313d8324359f762%を参照してください。 5E2..8381e23ec6d557059d15c73ea313d8324359f762 /

言い換えると、Holo対応デバイス以上を開発する場合、スピナーが有効状態を子に伝播することを期待できます。Android 2デバイスは現在も販売されており、市場シェアも少しあるため、多くの場合、箱から出してすぐに機能しない古いスピナーと一緒に暮らす必要があります。

于 2012-12-04T12:01:19.037 に答える