如何让Spinner的“禁用”状态看起来被禁用?

当我禁用我的微调,它看起来几乎完全像它被禁用之前,即

之前

在这里输入图像说明

在这里输入图像说明

它是残疾人,所以function一切都很好,但我希望它看起来被禁用。 这个问题似乎已经被问及陷阱周围(例如在这里这里 ),但最接近的任何人的答案是这样的 ,这似乎不完整,我不明白吗?

罗曼说,这是固定在Froyo起,但我使用蜂窝,正如你可以从截图看到,它似乎并没有工作。 任何意见,将不胜感激。

Solutions Collecting From Web of "如何让Spinner的“禁用”状态看起来被禁用?"

不知道你是否还需要这个,但是有办法。 我自己一直在努力解决这个问题。 我最终做了这样的事情:

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

这实际上是做的是禁用微调框和显示的选定的项目。 最有可能select的项目是一个TextView ,它应该显示为禁用的TextView。

我正在使用这个,它的工作原理。 但由于某种原因,我不知道其他残疾人的观点是“灰色的”。 它仍然看起来禁用,但。 试试看。

如果您使用自定义布局创build适配器(即扩展R.layout.simple_spinner_item ),请将此属性添加到XML: android:duplicateParentState="true"

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

spnr是我的Spinner对象,它通过findViewById(...)引用XML视图文件。

这工作对我来说…禁用微调

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

并启用它

 your_spinner.setEnabled(true); 

.getSelectedView()不适合我。 所以我欺骗了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); 

为了使我的微调:

 ((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.blue_text)); mySpinner.setEnabled(true); mySpinner.setFocusable(true); 

您不需要更改样式或修改任何XML。 只要在你的代码中做到这一点,即使在事件方法,你应该没问题。

视图可以由多个可触摸的元素组成。 你必须全部禁用它们,像这样:

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

如果它是一个简单的,因为它也返回自己:

查找并返回这个视图的后代的所有可触摸的视图,如果它可以触摸,可能包括这个视图。

查看#getTouchables()

我可能是一个特例,或者是由于我设置适配器的顺序,或者是由于我使用了两个自定义的微调器类:

  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); } } 

我有一个类似的问题,除了getChildView为我返回null,所以例外的解决scheme没有工作。 我相信这是因为我把适配器设置为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"/> 

对我来说,解决scheme是删除“启用”和“可点击的”属性,并把下面的代码放在我的“onCreate”

 spinner.setEnabled(false); 

希望它可以帮助别人!

你也可以不使用types转换,如下所示:

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

使纺纱厂看起来残疾的一个聪明的方法是降低透明度。

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

我已经尝试了以下,并按预期对我工作:

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