Как отключить состояние отключенного состояния Spinner?
Когда я отключу свой Spinner, он выглядит почти так же, как и до отключения, т.е.
До
![enter image description here]()
После
![enter image description here]()
Он отключен, и поэтому функционально все в порядке, но я бы хотел, чтобы он выглядел отключен. Этот вопрос, кажется, был задан вокруг ловушек (здесь и здесь), но ближайший кто-либо приходит к ответу this, который кажется неполным, и я все равно не понимаю?!?
Ромен сказал, это должно было быть исправлено в Froyo, но я использую Honeycomb, и, как вы можете видеть на скриншотах, это похоже, не работает. Любые советы будут оценены.
Ответы
Ответ 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;
}
});