【问题标题】:Android : How to make a spinner disabled look disabledAndroid : 如何使禁用的微调器看起来已禁用
【发布时间】:2013-02-23 06:34:31
【问题描述】:

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


【解决方案1】:

我想出了最简单的方法:

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

它不会改变颜色或字体,只是让它更透明一点......

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在发布这个问题之前就尝试了你的建议。它实际上不适用于运行 froyo 和姜饼的模拟器,但是当后来我在实际的 ICS 设备上测试时,它似乎工作得很好。我没有 froyo 设备来验证这是否适用于实际的 froyo 设备。无论如何,谢谢。
    • 找不到背景资源字段。在 android 5.0 上应用您的解决方案时,我也会收到“错误充气类 Spinner”
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2011-08-24
        • 2021-06-06
        • 2011-12-16
        • 1970-01-01
        相关资源
        最近更新 更多