不知道你是否仍然需要这个,但是有一种方法。我自己也曾苦于这个问题。最终我做了类似这样的事情:
((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);
这实际上是禁用了旋转器和显示的选定项。最有可能的选定项是TextView,它应该显示为禁用的TextView。
我正在使用这个方法并且它有效。但出于我不知道的某种原因,它不像其他禁用视图那样灰色。尽管如此,它仍然看起来被禁用。试一下吧。
使旋转器看起来失效的一个巧妙方法是降低透明度。
Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
如果您正在创建具有自定义布局的适配器(即扩展 R.layout.simple_spinner_item
),请将此属性添加到XML中:android:duplicateParentState="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。只需在您的代码中执行此操作,即使在事件方法中,也应该可以正常运行。
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);
spnr是我的Spinner
对象,它通过findViewById(...)
引用XML视图文件。
_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);
your_spinner.getSelectedView();
your_spinner.setEnabled(false);
并使其重新启用
your_spinner.setEnabled(true);
我的情况可能比较特殊,可能是由于我设置适配器的顺序或者我使用了两个自定义的Spinner类:
我发现让Spinner看起来像是被禁用的关键在于:
在这两个自定义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);
}
}
我有一个类似的问题,不同的是 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"/>
spinner.setEnabled(false);
希望能对某人有所帮助!
我写了一个小的 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
}
}