如何让下拉框的“禁用”状态看起来被禁用?

30

当我禁用我的Spinner时,它看起来几乎与禁用之前一样,也就是说:

之前

enter image description here

之后

enter image description here

它已被禁用,因此在功能上一切正常,但我希望它看起来被禁用。似乎已经有人问过类似的问题(例如这里这里),但最接近答案的是这个,但它似乎不完整,我也不理解???

Romain说这将在Froyo版本及以后修复,但我正在使用Honeycomb,正如你从屏幕截图中看到的那样,它似乎没有起作用。感谢任何建议。

14个回答

45

不知道你是否仍然需要这个,但是有一种方法。我自己也曾苦于这个问题。最终我做了类似这样的事情:

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

这实际上是禁用了旋转器和显示的选定项。最有可能的选定项是TextView,它应该显示为禁用的TextView。

我正在使用这个方法并且它有效。但出于我不知道的某种原因,它不像其他禁用视图那样灰色。尽管如此,它仍然看起来被禁用。试一下吧。


9
这对我没有用,getSelectedView()在我调用spinner.setSelection()后返回null。 - Rafael Nobre
@nobre:在调用setSelection()之前,您是否设置了Spinner适配器?如果没有,即使您稍后设置了适配器并且Spinner已经填充,getSelectedView()也会返回null。 - Bandreid
2
现在有一个名为disableChildrenWhenDisabled的Spinner属性,似乎可以实现相同的功能。详见:https://developer.android.com/reference/android/support/v7/mediarouter/R.attr.html#disableChildrenWhenDisabled - Rupert Rawnsley
这不是一个像下面那个答案一样强大的解决方案,而且那个也能工作,而且你不必专门设置所选视图禁用/启用。 - mpellegr

15

使旋转器看起来失效的一个巧妙方法是降低透明度。

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

6

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

该属性会使得适配器中的子视图继承其父视图的状态,从而使得子视图在按下或选中时也能够显示正确的状态。


3

.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。只需在您的代码中执行此操作,即使在事件方法中,也应该可以正常运行。


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

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


2
我尝试了以下方法,对我来说效果符合预期:
_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);

1
这对我有帮助... 禁用旋转器。
your_spinner.getSelectedView();
your_spinner.setEnabled(false);

并使其重新启用

your_spinner.setEnabled(true);

你的第一行缺少一个 .setEnabled(false)。 - thecoolmacdude

0

我的情况可能比较特殊,可能是由于我设置适配器的顺序或者我使用了两个自定义的Spinner类:

  1. 第一个类继承了LinearLayout类,
  2. 第二个类继承了Spinner类。

我发现让Spinner看起来像是被禁用的关键在于:

  1. 在setEnabled函数中使旧对象失效,以及
  2. 在onDraw函数中设置颜色。

在这两个自定义Spinner类中,我都有一个特殊的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);
    }
}

0

我有一个类似的问题,不同的是 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);

希望能对某人有所帮助!


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接