我尝试了帖子中提到的解决方案,即
((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);
但是 getSelectedView() 返回 null。我也尝试手动选择一个项目,而不是调用 getSelectedView 但它仍然返回 null。
我尝试了帖子中提到的解决方案,即
((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);
但是 getSelectedView() 返回 null。我也尝试手动选择一个项目,而不是调用 getSelectedView 但它仍然返回 null。
我想出了最简单的方法:
private void setSpinnerEnabled(Spinner spinner, boolean enabled) {
spinner.setEnabled(enabled);
spinner.setAlpha(enabled ? 1.0f : 0.4f);
}
它不会改变颜色或字体,只是让它更透明一点......
一种方法是编写自己的 SpinnerAdapter(例如 ArrayAdapter),然后覆盖 getView() 方法。通常该方法会膨胀 android.R.layout.simple_spinner_item 布局并将 TextView 绑定到您的数据(在 ArrayAdapter 的情况下为数组)。您可以采用该布局(从您的 Android SDK 文件夹中复制它)并创建一个禁用版本,然后执行以下操作:
private static final int SPINNER_ENABLED = android.R.layout.simple_spinner_item;
private static final int SPINNER_DISABLED = R.layout.simple_spinner_item_disabled;
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
View spinnerView = View.inflate(getContext(), isEnabled(position) ? SPINNER_ENABLED : SPINNER_DISABLED, null);
TextView textView = (TextView) spinnerView.findViewById(R.id.text1);
textView.setText(getItem(position).toString());
return spinnerView;
}
android.R.layout.simple_spinner_item 看起来像这样:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee" />
像这样在 res/drawable 文件夹中创建一个可绘制选择器
custonspinner.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- disabled state -->
<item android:state_enabled="false" android:color="#9D9FA2" />
<item android:color="#000"/>
</selector>
// 你也可以在选择器中给出drawable而不是颜色
在你的微调器中设置这样的背景资源
android:backgroundResource="@drawable/customspinner"
@JSPDeveloper01 的回答对我来说不太管用(可能是因为我设置适配器的顺序,或者是因为我使用了两个自定义微调器类:第一个类扩展了 LinearLayout 类;第二个扩展 Spinner 类)。关键是在 setEnabled 函数中使旧对象无效并在 onDraw 函数中设置颜色。
在这两个自定义微调器类中,我有一个像这样的特殊 setEnabled 函数,使旧视图无效:
public void setEnabled(Boolean enabled) {
super.setEnabled(enabled);
invalidate();
}
我还覆盖了每个自定义微调器类中的 onDraw 函数(使用 JSPDeveloper01 的部分答案):
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (this.getChildAt(0) != null) {
this.getChildAt(0).setAlpha(this.isEnabled() ? 1.0f : 0.7f);
}
}