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

时间:2011-10-03 23:40:58

标签: android spinner android-spinner

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

之前

enter image description here

enter image description here

它被禁用,所以在功能上一切都很好,但我希望看起来禁用。这个问题似乎是围绕陷阱进行的(例如 here here ),但最接近答案的是 this ,看似不完整,我还不明白?!?

Romain said 要在F​​royo开始修复,但我正在使用Honeycomb,正如您从屏幕截图中看到的那样,它似乎不起作用。任何建议将不胜感激。

14 个答案:

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

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

  

查找并返回作为此视图后代的所有可触摸视图,如果它本身可以触摸,则可能包括此视图。

View#getTouchables()

答案 8 :(得分:0)

由于我正在设置我的适配器的顺序,或者由于我正在使用两个自定义微调器

  1. 第一个类扩展了LinearLayout类和
  2. 第二个扩展Spinner类。
  3. 我发现让微调器看起来禁用的键是:

    1. 使setEnabled函数中的旧对象失效,
    2. onDraw功能中设置颜色。
    3. 在这两个自定义微调器类中,我有一个像这样的特殊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
    }
}