Android:如何使微调框禁用外观已禁用

问题描述 投票:1回答:5

How do I make a Spinner's "disabled" state look disabled?的可能重复项。

我尝试了帖子中提到的解决方案,即

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

但是getSelectedView()返回null。我还尝试过手动选择一个项目,然后调用getSelectedView,但它仍返回null。

android android-widget android-spinner
5个回答
1
投票

像这样在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>

//您也可以给可绘制对象而不是选择器中的颜色

在微调器中像这样设置背景资源

android:backgroundResource="@drawable/customspinner"

12
投票

我想出了最简单的方法:

private void setSpinnerEnabled(Spinner spinner, boolean enabled) {
    spinner.setEnabled(enabled);
    spinner.setAlpha(enabled ? 1.0f : 0.4f);
}

它不会改变颜色或字体,只是使其更加透明...


0
投票

一种方法是编写自己的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" />

0
投票

@@ 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);
    }
}

0
投票
        spinner.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.