web-dev-qa-db-ja.com

スピナーの「無効」状態を無効にするにはどうすればよいですか?

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

変更前

enter image description here

enter image description here

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

ロマンは言った Froyo以降で修正される予定でしたが、私はハニカムを使用しており、スクリーンショットからわかるように、作業。任意のアドバイスをいただければ幸いです。

28
MisterWeary

これがまだ必要かどうかはわかりませんが、方法はあります。私自身もこの問題に取り組んできました。私はこのようなことをすることになりました:

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

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

私はこれを使用しており、動作します。しかし、何らかの理由で私にはわからないため、他の無効化されたビューほど「グレー表示」されていません。それでも無効になっているように見えます。やってみて。

43
Bandreid

スピナーを無効に見えるようにする賢い方法の1つは、透明度を下げることです。

Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
6
PaulrBear

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

4
rymo
_((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);
_

spnrは、findViewById(...)によってXMLビューファイルを参照するSpinnerオブジェクトです。

3
Randika Vishman

私は以下を試しました、そしてそれは私にとって期待通りに機能しています:

_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);
2
Rabia Abu Hanna

.getSelectedView()が機能しませんでした。だから私はSpinnerをだましてshowを無効にしました。

disabledの外観には独自の色を定義する必要があります。

例:

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

したがって、私のspinner:を無効にする

((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を変更したりする必要はありません。コードでこれを行うだけで、イベントメソッド内でも問題ありません。

1
Arlyn

これは私のために働いた...スピナーを無効にするために

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

それを再び有効にします

your_spinner.setEnabled(true);
1
ashish.n

これは、以前に@ JSPDeveloper01によって回答された同じ質問に対する最良の解決策であることがわかりました: https://stackoverflow.com/a/20401876/8041634

Androidが無効に設定されている場合、スピナーはグレー表示されないため、スピナーで.setAlphaコマンドを使用してテキストをグレー表示するカスタムメソッドを作成することをお勧めしますその中で。

0
shagberg

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

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) {

    }
 }
0
Pankaj

私がアダプタを設定している順序、または2つのカスタムスピナーを使用しているという事実が原因で、鉱山が特殊なケースになる可能性がありますclasses:

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

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

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

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

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

各カスタムスピナーのonDraw関数もオーバーライドしますclass:

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

    if (this.getChildAt(0) != null) {
        this.getChildAt(0).setAlpha(this.isEnabled() ? 1.0f : 0.7f);
    }
}
0
thecoolmacdude

後で参照できるように、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)

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

0
nluk

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

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

それ自体も返すので、それが単純なものである場合:

このビューの子孫であるすべてのタッチ可能なビューを見つけて返します。タッチ可能な場合は、このビューも含まれます。

View#getTouchables()

0
josetapadas

同様の問題がありましたが、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);

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

0
maxandron