30

スピナーを無効にすると、無効にする前とほぼ同じように見えます。

ここに画像の説明を入力

ここに画像の説明を入力

無効になっているため、機能的にはすべて問題ありませんが、無効に見えるようにしたいと思います。この質問はトラップの周りで尋ねられたようです(たとえば、ここここ)が、誰かが答えに最も近いのはこれです。これは不完全に見え、とにかく理解できません?!?

Romain はFroyo 以降で修正されると言っていましたが、私は Honeycomb を使用しており、スクリーンショットからわかるように、機能していないようです。アドバイスをいただければ幸いです。

4

14 に答える 14

45

これがまだ必要かどうかはわかりませんが、方法はあります。私はこの問題に苦労してきました。私は最終的に次のようなことをしました:

((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);

これが実際に行うことは、スピナーと表示されている選択されたアイテムを無効にすることです。ほとんどの場合、選択されたアイテムはTextViewであり、無効な TextView として表示されます。

私はこれを使用していますが、動作します。しかし、何らかの理由で、他の無効なビューほど「グレーアウト」していません。それでも無効に見えます。やってみて。

于 2012-02-01T09:41:33.470 に答える
6

カスタム レイアウト (つまり、 を拡張) を使用してアダプタを作成する場合は、R.layout.simple_spinner_item次の属性を XML に追加します。android:duplicateParentState="true"

于 2014-12-17T20:30:19.610 に答える
3

私には.getSelectedView()うまくいきませんでした。だから私はだまされて無効になっているSpinnerことを示しました。

無効な外観のために独自の色を定義する必要があります。

例えば:

R.color.blue_text //means enabled
R.color.gray_text //means disabled

だから私のスピナーを無効にするには:

((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.gray_text));
mySpinner.setEnabled(false);
mySpinner.setFocusable(false);

スピナーを有効にするには:

((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.blue_text));
mySpinner.setEnabled(true);
mySpinner.setFocusable(true);

スタイルを変更したり、XML を変更したりする必要はありません。イベントメソッド内であっても、コードでこれを行うだけで問題ありません。

于 2015-06-04T14:18:10.630 に答える
3
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);

spnrSpinner、XML ビュー ファイルを参照するオブジェクトfindViewById(...)です。

于 2013-01-09T03:25:51.253 に答える
1

これは私にとってはうまくいきました...スピナーを無効にするため

your_spinner.getSelectedView();
your_spinner.setEnabled(false);

そしてそれを再び有効にします

your_spinner.setEnabled(true);
于 2013-06-26T09:10:20.883 に答える
0

ビューは、複数のタッチ可能な要素で構成できます。次のように、それらをすべて無効にする必要があります。

for(View lol : your_spinner.getTouchables() ) {
    lol.setEnabled(false);
}

それ自体も返すため、単純なものの場合:

このビューの子孫であるすべてのタッチ可能なビューを検索して返します。このビュー自体がタッチ可能な場合は、このビューを含む可能性があります。

View#getTouchables()

于 2013-10-17T16:12:07.683 に答える
0

私の場合は、アダプターを設定する順序が原因であるか、2 つのカスタム スピナークラスを使用しているという事実により、特殊なケースになる可能性があります。

  1. 最初のクラスはクラスを拡張しLinearLayout
  2. Spinner2 番目はクラスを拡張します。

スピナーが無効に見えるようにするために私が見つけたキーは次のとおりです。

  1. setEnabled関数内の古いオブジェクトを無効にする
  2. 関数で色を設定しonDrawます。

これらのカスタム スピナー クラスの両方の中に、次のsetEnabledような特別な関数があり、古いビューを無効にします。

public void setEnabled(Boolean enabled) {
    super.setEnabled(enabled);
    invalidate();
}

onDrawまた、各カスタム スピナークラスで関数をオーバーライドします。

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (this.getChildAt(0) != null) {
        this.getChildAt(0).setAlpha(this.isEnabled() ? 1.0f : 0.7f);
    }
}
于 2014-12-03T17:14:36.943 に答える
0

次のように型キャストせずに行うこともできます。

new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
             // Depend on your selection check position and disable it
             if(position == 1) {
                view.setEnabled(false);
                view.setEnabled(false);
             }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
 }
于 2016-11-04T08:08:09.453 に答える
0

getChildView が null を返したことを除いて、同様の問題があったため、例外的な解決策は機能しませんでした。これは、アダプターを XML で設定したために発生したと考えられます。これにより、「クリック可能」および「有効」属性が無視されました。

これは私のXMLでした:

<Spinner
android:id="@+id/my_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_large"
android:alpha="0.86"
android:enabled="false"
android:clickable="false"
android:entries="@array/array_of_entries"
android:spinnerMode="dropdown"/>

私にとっての解決策は、「有効」属性と「クリック可能」属性を削除し、「onCreate」に次のコードを追加することでした

spinner.setEnabled(false);

それが誰かを助けることを願っています!

于 2015-11-08T10:45:14.047 に答える
0

Kotlin 拡張機能を少し書きました。

// android spinner enable/disable doesn't grey out the item.
// this does.
private fun AppCompatSpinner?.setEnabled(enable:Boolean) {
    if (this != null) {
        isEnabled = enable
        alpha = if (enable) 1.0f else 0.5f
    }
}
于 2021-05-28T21:31:58.197 に答える
0

今後の参考のために、Kotlin を使用している場合は、拡張機能を利用して、無効な要素にカスタム動作を提供できます。

fun Spinner.forceEnabled(isEnabled : Boolean){
    setEnabled(isEnabled)
    getChildAt(0)?.let{ childView ->
        childView.alpha = if (this.isEnabled) 1.0f else 0.33f
    }
    invalidate()
}

someSpinner.forceEnabled(true)

これにより、スピナーが無効になっているため、サブクラス化する必要なく、スピナーの子ビューにカスタム プロパティを設定できます。拡張機能は静的に解決されるため、注意してください。

于 2020-01-24T22:52:54.237 に答える