当我禁用我的微调器时,它看起来几乎与禁用之前完全一样,即
前
后
它被禁用,所以功能上一切都很好,但我希望它看起来被禁用。这个问题似乎是围绕陷阱提出的(例如这里和这里),但最接近答案的人是这个,这似乎不完整,我还是不明白?!?
Romain 说它将在 Froyo 之后修复,但我使用的是 Honeycomb,从截图中可以看出,它似乎不起作用。任何意见,将不胜感激。
不知道你是否还需要这个,但有办法。我自己一直在努力解决这个问题。我最终做了这样的事情:
((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"
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);
spnr是我的Spinner
对象,它引用 XML 视图文件,由findViewById(...)
.
对.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);
这对我有用...用于禁用微调器
your_spinner.getSelectedView();
your_spinner.setEnabled(false);
并启用它
your_spinner.setEnabled(true);
视图可以由多个可触摸元素组成。您必须将它们全部禁用,如下所示:
for(View lol : your_spinner.getTouchables() ) {
lol.setEnabled(false);
}
如果它是一个简单的,因为它也返回自己:
查找并返回作为该视图后代的所有可触摸视图,如果它本身是可触摸的,则可能包括该视图。
由于我设置适配器的顺序或由于我使用两个自定义微调器类的事实,我的情况可能是一种特殊情况:
LinearLayout
类,并且Spinner
类。我发现让微调器看起来被禁用的关键是:
setEnabled
,并且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:
<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);
希望它可以帮助某人!
您也可以不进行类型转换,如下所示:
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
微调器上的命令,将其中的文本灰显。杰出的。
为了将来参考,如果您使用的是 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)
这将允许为微调器子视图设置自定义属性,因为微调器被禁用,而无需子类化。请小心,因为扩展功能是静态解析的!
我写了一个小小的 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
}
}