Подтвердить что ты не робот

Как отключить состояние отключенного состояния Spinner?

Когда я отключу свой Spinner, он выглядит почти так же, как и до отключения, т.е.

До

enter image description here

После

enter image description here

Он отключен, и поэтому функционально все в порядке, но я бы хотел, чтобы он выглядел отключен. Этот вопрос, кажется, был задан вокруг ловушек (здесь и здесь), но ближайший кто-либо приходит к ответу this, который кажется неполным, и я все равно не понимаю?!?

Ромен сказал, это должно было быть исправлено в Froyo, но я использую Honeycomb, и, как вы можете видеть на скриншотах, это похоже, не работает. Любые советы будут оценены.

4b9b3361

Ответ 1

Не знаю, нужна ли вам эта проблема, но есть способ. Я сам боролся с этой проблемой. В итоге я сделал что-то вроде этого:

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

Что это на самом деле делает, это отключить счетчик и выбранный элемент, который отображается. Скорее всего, выбранным элементом является TextView, и он должен отображаться как отключенный TextView.

Я использую это, и он работает. Но по какой-то причине мне неизвестно, что это не так "greyed-out", как другие отключенные взгляды. Однако он все еще выглядит инвалидом. Попробуйте.

Ответ 2

Один из умных способов заставить прядильщиков выглядеть отключенными - это снизить прозрачность.

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

Ответ 3

Если вы создаете адаптер с настраиваемым макетом (т.е. расширяете R.layout.simple_spinner_item), добавьте этот атрибут в XML: android:duplicateParentState="true"

Ответ 4

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

spnr - это мой объект Spinner, который ссылается на файл представления XML, на findViewById(...).

Ответ 5

Я пробовал следующее, и он работает как ожидалось для меня:

_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);

Ответ 6

это сработало для меня... Чтобы отключить счетчик

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

и включив его

your_spinner.setEnabled(true);

Ответ 7

.getSelectedView() не работал у меня. Поэтому я обманул Spinner, чтобы показать, что он отключен.

Вам нужно будет определить свои собственные цвета для отключенного вида.

Пример:

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. Просто сделайте это в своем коде, даже в методах событий, вы должны быть в порядке.

Ответ 8

Представления могут быть составлены несколькими касающимися элементами. Вы должны отключить их все, например:

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

Если он простой, так как он также возвращает себя:

Найти и вернуть все осязаемые представления, которые являются потомками этого представления, возможно, включая это представление, если оно осязаемо.

Просмотр # getTouchables()

Ответ 9

Шахта может быть специальным случаем либо из-за того, что я устанавливаю свой адаптер, либо из-за того, что я использую два настраиваемых класса :

  • Первый класс расширяет класс LinearLayout и
  • Второй расширяет класс Spinner.

Ключи, которые я нашел, чтобы отключить счетчик, были:

  • Недействительность старого объекта в функции setEnabled и
  • Установка цвета в функции onDraw.

Внутри каждого из этих пользовательских классов spinner у меня есть специальная функция setEnabled, подобная этой, аннулирование старого представления:

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

Я также переопределяю функцию onDraw в каждом настраиваемом spinner :

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

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

Ответ 10

У меня была аналогичная проблема, за исключением того, что getChildView возвратил null для меня, поэтому решение с исключением не сработало. Я считаю, что это было вызвано тем, что я установил адаптер в XML, и это игнорировало атрибуты "clickable" и "enabled".

Это был мой 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"/>

Решение для меня заключалось в том, чтобы удалить атрибуты "enabled" и "clickable" и поместите следующий код в мой "onCreate"

spinner.setEnabled(false);

Надеюсь, это поможет кому-то!

Ответ 11

Вы можете обойтись без типизации следующим образом:

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

    }
 }

Ответ 12

Я обнаружил, что это лучшее решение того же вопроса, на который ранее ответил @JSPDeveloper01: fooobar.com/questions/6269372/...

Поскольку Android не затеняет счетчик, когда он отключен, он предлагает создать собственный метод, использующий команду .setAlpha на счетчике, которая выделяет текст внутри него. Brilliant.

Ответ 13

        spinner.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });