如何禁用Spinner的“禁用”状态?

当我禁用我的Spinner时,它看起来几乎与被禁用之前一样,即

之前

在此处输入图像描述

在此处输入图像描述

它是禁用的,所以在function上一切都很好,但我希望它看起来是禁用的。 这个问题似乎已被问到陷阱( 这里这里 ),但是最接近答案的是这个 ,看起来不完整,我还不明白?!?

Romain说要在Froyo开始修复,但是我正在使用Honeycomb,正如你从屏幕截图中看到的那样,它似乎不起作用。 任何意见,将不胜感激。

  • 封闭式微调器的文本颜色
  • 是否存在与Widget.Material.Spinner.Underlined相当的AppCompat?
  • Android Spinner使用ArrayList
  • 从微调器下拉列表中删除边距
  • 更改微调器DropDown宽度
  • 如何在XML中的微调器中添加提示
  • 如何在ActionBarSherlock导航微调器中包装文本内容
  • Android Spinner - onItemSelected / setOnItemSelectedListener未触发
  • 不知道你是否仍然需要这个,但有办法。 我自己一直在努力解决这个问题。 我最终做了这样的事情:

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

    这实际上是禁用微调器和显示的选定项目。 很可能所选项目是TextView ,它应该显示为禁用的TextView。

    我正在使用它,它的工作原理。 但由于某些原因我不知道它不像其他残疾观点那样“灰暗”。 它仍然看起来残疾。 试试看。

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

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

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

    使旋转器看起来禁用的一种巧妙方法是降低透明度。

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

    这对我有用……对于禁用微调器

     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。 只需在代码中执行此操作,即使在事件方法中,也应该没问题。

    我已经尝试了以下内容,它正如我所期望的那样:

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

    视图可以由多个可触摸元素组成。 你必须全部禁用它们,如下所示:

     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,所以例外的解决方案不起作用。 我认为这是因为我在XML中设置了适配器,这忽略了“可点击”和“已启用”属性。

    这是我的XML:

      

    我的解决方案是删除“启用”和“可点击”属性,并将以下代码放在我的“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) { } } 

    我发现这是@ JSPDeveloper01之前回答的同一个问题的最佳解决方案: https ://stackoverflow.com/a/20401876/8041634

    由于Android在设置为禁用时不会使微调器灰显,因此他建议创建一个自定义方法,该方法在微调器上使用.setAlpha命令,该命令将其中的文本灰显。 辉煌。