30

当我禁用我的微调器时,它看起来几乎与禁用之前完全一样,即

在此处输入图像描述

在此处输入图像描述

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

Romain 说它将在 Froyo 之后修复,但我使用的是 Honeycomb,从截图中可以看出,它似乎不起作用。任何意见,将不胜感激。

4

14 回答 14

45

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

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

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

我正在使用它并且它有效。但由于某种我不知道的原因,它不像其他禁用视图那样“灰显”。虽然它看起来仍然被禁用。试试看。

于 2012-02-01T09:41:33.470 回答
14

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

Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
于 2017-06-12T21:45:53.647 回答
6

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

于 2014-12-17T20:30:19.610 回答
3
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);

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

于 2013-01-09T03:25:51.253 回答
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。只需在您的代码中执行此操作,即使在事件方法中,您也应该没问题。

于 2015-06-04T14:18:10.630 回答
2

我尝试了以下方法,它对我来说按预期工作:

_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);
于 2017-11-13T21:28:12.370 回答
1

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

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

并启用它

your_spinner.setEnabled(true);
于 2013-06-26T09:10:20.883 回答
0

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

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

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

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

查看#getTouchables()

于 2013-10-17T16:12:07.683 回答
0

由于我设置适配器的顺序或由于我使用两个自定义微调器类的事实,我的情况可能是一种特殊情况:

  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);
    }
}
于 2014-12-03T17:14:36.943 回答
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);

希望它可以帮助某人!

于 2015-11-08T10:45:14.047 回答
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) {

    }
 }
于 2016-11-04T08:08:09.453 回答
0

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

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

于 2018-02-12T16:42:17.853 回答
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)

这将允许为微调器子视图设置自定义属性,因为微调器被禁用,而无需子类化。请小心,因为扩展功能是静态解析的!

于 2020-01-24T22:52:54.237 回答
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
    }
}
于 2021-05-28T21:31:58.197 回答