当我禁用我的Spinner时,它看起来几乎与被禁用之前一样,即
之前
后
它被禁用,所以在功能上一切都很好,但我希望看起来禁用。这个问题似乎是围绕陷阱进行的(例如 here 和 here ),但最接近答案的是 this ,看似不完整,我还不明白?!?
Romain said 要在Froyo开始修复,但我正在使用Honeycomb,正如您从屏幕截图中看到的那样,它似乎不起作用。任何建议将不胜感激。
答案 0 :(得分:43)
不知道你是否还需要这个,但有办法。我自己一直在努力解决这个问题。我最终做了这样的事情:
((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);
这实际上是禁用微调器和显示的选定项目。很可能所选项目是TextView,它应该显示为禁用的TextView。
我正在使用它并且它有效。但由于某些原因我不知道它并不像其他残疾观点那样“灰暗”。它看起来仍然是残疾人。尝试一下。
答案 1 :(得分:5)
使微调器看起来禁用的一种聪明方法是降低透明度。
Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
答案 2 :(得分:4)
如果您要使用自定义布局创建适配器(即扩展R.layout.simple_spinner_item
),请将此属性添加到XML:android:duplicateParentState="true"
答案 3 :(得分:3)
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);
spnr 是我的Spinner
对象,它引用了findViewById(...)
的XML视图文件。
答案 4 :(得分:1)
your_spinner.getSelectedView();
your_spinner.setEnabled(false);
并启用它
your_spinner.setEnabled(true);
答案 5 :(得分:1)
reference
对我不起作用。所以我欺骗了.getSelectedView()
show 被禁用。
您需要为已禁用外观定义自己的颜色。
例如:
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);
您无需更改样式或修改任何XML。只需在代码中执行此操作,即使在事件方法中,也应该没问题。
答案 6 :(得分:1)
我已经尝试了以下内容,它正如我预期的那样工作:
_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);
答案 7 :(得分:0)
视图可以由多个可触摸元素组成。你必须全部禁用它们,如下所示:
for(View lol : your_spinner.getTouchables() ) {
lol.setEnabled(false);
}
如果它是一个简单的,因为它也会自行返回:
查找并返回作为此视图后代的所有可触摸视图,如果它本身可以触摸,则可能包括此视图。
答案 8 :(得分:0)
由于我正在设置我的适配器的顺序,或者由于我正在使用两个自定义微调器类
LinearLayout
类和Spinner
类。我发现让微调器看起来禁用的键是:
setEnabled
函数中的旧对象失效,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);
}
}
答案 9 :(得分: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);
希望它有所帮助!
答案 10 :(得分: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) {
}
}
答案 11 :(得分:0)
我发现这是@ JSPDeveloper01之前回答的同一个问题的最佳解决方案: https://stackoverflow.com/a/20401876/8041634
由于Android在设置为禁用时不会使微调器变灰,因此他建议创建一个自定义方法,该方法在微调器上使用.setAlpha
命令,该方法将其中的文本灰显。辉煌。
答案 12 :(得分: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)
这将允许在不指定子类的情况下禁用微调器,从而为微调器子视图设置自定义属性。请小心,因为扩展功能是静态解析的!
答案 13 :(得分: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
}
}