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

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

До

введите здесь описание изображения

После

введите здесь описание изображения

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

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


person MisterWeary    schedule 03.10.2011    source источник


Ответы (14)


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

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

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

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

person Bandreid    schedule 01.02.2012
comment
У меня это не сработало, getSelectedView() возвращает null сразу после вызова spinner.setSelection() - person Rafael Nobre; 23.08.2012
comment
@nobre: ​​Вы устанавливаете адаптер счетчика перед вызовом setSelection ()? Если нет, даже если вы установите адаптер впоследствии и счетчик будет заполнен, getSelectedView() вернет значение null - person Bandreid; 24.01.2014
comment
Есть атрибут Spinner, который теперь делает то же самое и называется disableChildrenWhenDisabled developer.android.com/reference/android/support/v7/mediarouter/ - person Rupert Rawnsley; 13.01.2015
comment
Это не такое надежное решение, как приведенный ниже ответ, и он тоже работает, плюс вам не нужно специально отключать/включать выбранный вид. - person mpellegr; 18.02.2016

Один умный способ заставить счетчики выглядеть отключенными — уменьшить прозрачность.

Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
person Paul Wintz    schedule 12.06.2017

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

person rymo    schedule 17.12.2014

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

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

person Randika Vishman    schedule 09.01.2013

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

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

Например:

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

person Arlyn    schedule 04.06.2015

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

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

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

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

и включить его обратно

your_spinner.setEnabled(true);
person ashish.n    schedule 26.06.2013
comment
Вам не хватает .setEnabled(false) в первой строке. - person thecoolmacdude; 03.07.2014

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

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

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

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

View#getTouchables()

person josetapadas    schedule 17.10.2013

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

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

Ключи, которые я нашел для того, чтобы счетчик выглядел отключенным, были:

  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);
    }
}
person thecoolmacdude    schedule 03.12.2014

У меня была аналогичная проблема, за исключением того, что 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);

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

person maxandron    schedule 08.11.2015

Можно обойтись и без приведения типов следующим образом:

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

    }
 }
person Pankaj    schedule 04.11.2016

Я обнаружил, что это лучшее решение того же вопроса, на который ранее отвечал @JSPDeveloper01: https://stackoverflow.com/a/20401876/8041634

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

person shagberg    schedule 12.02.2018

Для справки в будущем, если вы используете 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)

Это позволит установить пользовательские свойства для дочерних представлений счетчика, поскольку счетчик отключается, без необходимости создания подклассов. Будьте осторожны, так как функции расширения разрешаются статически!

person nluk    schedule 24.01.2020

Я написал небольшое расширение для 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
    }
}
person steven smith    schedule 28.05.2021