android 更改微调器中项目的文本颜色

2024-06-28

我有一个微调器,在某些情况下某些选项不应该被选择。我有使项目不可选择的代码,但它不会使文本颜色变灰以指定该项目不可选择。如何更改微调器中应禁用的项目的文本颜色?这是代码:

public class main extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PatchedSpinner pSpinner = (PatchedSpinner) findViewById(R.id.spinner2);
    ArrayList<String> testarray = new ArrayList<String>();
    testarray.add("item0");
    testarray.add("item1");
    testarray.add("item2");
    testarray.add("item3");

    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, 
            android.R.layout.simple_spinner_dropdown_item, testarray) { 

        @Override
        public boolean isEnabled(int position) {
            return position != 1;
        }

        public boolean areAllItemsEnabled() { 
            return false; 
        } 
    };
    pSpinner.setAdapter(spinnerAdapter);
}

下面是用于创建微调器的自定义微调器类,该微调器能够禁用微调器中的某些项目。

public class PatchedSpinner extends Spinner {

    public PatchedSpinner(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 

    public PatchedSpinner(Context context) { 
        super(context); 
    } 

    public PatchedSpinner(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    }

    @Override 
    public boolean performClick() {
        // this line removed, we do not want to delegate the click to the spinner.
        // boolean handled = super.performClick(); 

        Context context = getContext();

        final DropDownAdapter adapter = new DropDownAdapter(getAdapter());

        CharSequence mPrompt = getPrompt();

        AlertDialog.Builder builder = new AlertDialog.Builder(context); 
        if (mPrompt != null) { 
            builder.setTitle(mPrompt); 
        } 
        builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show();

        return true; 
    }

    private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { 
        private SpinnerAdapter mAdapter;

        public DropDownAdapter(SpinnerAdapter adapter) { 
            mAdapter = adapter; 
        }

        public int getCount() { 
            return mAdapter == null ? 0 : mAdapter.getCount(); 
        }

        public Object getItem(int position) { 
            return mAdapter == null ? null : mAdapter.getItem(position); 
        }

        public long getItemId(int position) { 
            return mAdapter == null ? -1 : mAdapter.getItemId(position); 
        }

        public View getView(int position, View convertView, ViewGroup parent) { 
            return getDropDownView(position, convertView, parent); 
        }

        public View getDropDownView(int position, View convertView,ViewGroup parent) { 
            if (mAdapter == null) {
                return null;
            }
            mAdapter.getDropDownView(position, convertView, parent);
        }

        public boolean hasStableIds() { 
            return mAdapter != null && mAdapter.hasStableIds(); 
        }

        public void registerDataSetObserver(DataSetObserver observer){ 
            if (mAdapter != null) { 
                mAdapter.registerDataSetObserver(observer); 
            } 
        }

        public void unregisterDataSetObserver(DataSetObserver observer) { 
            if (mAdapter != null) { 
                mAdapter.unregisterDataSetObserver(observer); 
            } 
        }

        // PATCHED 
        public boolean areAllItemsEnabled() { 
            if (mAdapter instanceof BaseAdapter) { 
                return ((BaseAdapter) mAdapter).areAllItemsEnabled(); 
            } else { 
                return true; 
            } 
        }

        // PATCHED 
        public boolean isEnabled(int position) { 
            if (mAdapter instanceof BaseAdapter) { 
                return ((BaseAdapter) mAdapter).isEnabled(position); 
            } else { 
                return true; 
            } 
        }

        public int getItemViewType(int position) { 
            return 0; 
        }

        public int getViewTypeCount() { 
            return 1; 
        }

        public boolean isEmpty() { 
            return getCount() == 0; 
        } 
    }
}

我发现要完成这项工作,您必须在主活动中设置 ArrayAdapter 时覆盖 getDropDownView 。

public class main extends Activity {  
     @Override 
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);  

        PatchedSpinner pSpinner = (PatchedSpinner) findViewById(R.id.spinner2); 
        ArrayList<String> testarray = new ArrayList<String>();
        testarray.add("item0");
        testarray.add("item1");
        testarray.add("item2");
        testarray.add("item3");
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item, testarray) {

           @Override      
           public boolean isEnabled(int position) {
               return position != 1;                             
           }

           @Override                
           public boolean areAllItemsEnabled() {
               return false;
           }

           @Override
           public View getDropDownView(int position, View convertView, ViewGroup parent){
               View v = convertView;
               if (v == null) {
                   Context mContext = this.getContext();
                   LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                   v = vi.inflate(R.layout.row, null);
               }

               TextView tv = (TextView) v.findViewById(R.id.spinnerTarget);
               tv.setText(testarray.get(position));

               switch (position) {
                   case 0:
                       tv.setTextColor(Color.RED);  
                       break; 
                   case 1:
                       tv.setTextColor(Color.BLUE);
                       break;
                   default:
                       tv.setTextColor(Color.BLACK);
                       break;
               }
               return v;  
           }              
        };

        pSpinner.setAdapter(spinnerAdapter); 
} 

正在膨胀的布局是一个名为 row.xml 的自定义布局。它用于设置下拉视图的显示。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14pt" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 更改微调器中项目的文本颜色 的相关文章

随机推荐

  • 添加适用于 Android 的 Google Cloud Messaging (FCM) - 注册流程

    几个星期以来 我一直在为 GCM 的实现而苦苦挣扎 但我真正想了解它是如何工作的 所以我决定采取 小步骤 首先 正如提到的here https developers google com cloud messaging registrati
  • 如何在php中显示curl的二进制数据

    我正在编写简单的 php 代理 但在显示 png 文件时遇到问题 输出是 它应该是 图像在 Notepad 中打开 我的 php 卷曲代码如下所示 ua Mozilla 5 0 Windows U Windows NT 5 1 en US
  • 表格的 元素中是否允许使用 ng-model?

    表格元素内是否允许使用 ng model 如果我更改特定列 即视图 角度会自动更新模型吗 如果您要使用 HTML 直接编辑表格单元格contenteditable属性 ng model 不会自动工作 因为默认情况下它仅适用于表单元素 有可能
  • C# 结构体中的引用类型

    我正在查看 C 中的类型值 并了解到它们不会像普通引用类型那样在堆上分配 如何分配具有引用类型的结构 e g struct simple public Employee e public bool topEmployee public vo
  • 在 Visual Studio 安装项目中安装后如何启动应用程序

    我已经使用 Visual Studio 2008 创建了一个安装项目 应用程序安装完成后 我希望它立即启动 关于如何做到这一点有什么想法吗 我使用脚本在 MSI 的最终形式上放置了 启动 ProductName 复选框 不过 我不能对剧本有
  • Hibernate注解

    我们应该在基于 Hibernate 的应用程序中使用 org hibernate annotations Entity 而不是 javax persistence Entity 吗 或者说没有这样的规则 org hibernate anno
  • 为 Android 离线(手动)安装 Intel x86 Atom 系统映像

    我想安装 Intel x86 Atom 系统映像 因为我的模拟器速度太慢 每次我尝试从 Android sdk 管理器安装它时 我都无法收到此消息 正在获取网址 https dl ssl google com android reposit
  • 如何可视化包含/指向彼此的 C 结构图?

    我正在使用Ubuntu 10 04 正在研究内核对象的编程 我遇到了一些相当复杂的结构 我很难阅读 所以我想我应该尝试找到一些可以帮助我可视化它们的工具 到目前为止我唯一能找到的是VCG http rw4 cs uni sb de sand
  • 在 Resharper 分析中忽略设计器和生成的文件

    我已经使用 Resharper 几天了 我真的很喜欢这个工具 但是有一件事让我很恼火 我想知道它是否可以改变 我从生成的代码中收到大量问题通知 我的项目中几乎有 1400 个 我想将这些文件设置为忽略 这样它们就不会像使用 StyleCop
  • 如何判断CoInitialize被调用了多少层?

    我正在对一个混乱的项目进行一些调试 之前的开发人员不知道他们在做什么 主要问题是尝试多线程应用程序失败 我现在正在清理混乱并试图找出问题出在哪里 问题之一是调用不一致CoInitialize为了使用ADO组件 继续我的上一个问题 https
  • 在 Android 应用程序中使用 GPS

    我目前正在研究在 Android 应用程序中使用 GPS 在 android 文档中我看到了以下行 LocationProvider locationProvider LocationManager NETWORK PROVIDER Or
  • ASP.net 角色和项目

    EDIT 重写了我原来的问题以提供更多信息 背景信息在我的工作中 我正在为客户开发 ASP Net Web 应用程序 在我们的实现中 我们使用诸如带有 MembershipProviders 和 RoleProviders 的表单身份验证之
  • ORA-12514: TNS: 侦听器当前不知道连接描述符中请求的服务

    我在尝试通过侦听器连接到 Oracle Database XE 时遇到问题 sqlplus system my password XE 我收到以下错误 ORA 12514 TNS listener does not currently kn
  • t-sql计算文本列中的唯一单词

    我有一列包含图像标题 我想做的是找到该栏中出现的最流行的单词 有没有办法用 t sql 来做到这一点 我认为你可以做这样的事情 我认为这不是最优化的 但您可以对其进行改进 创建一个表变量 t来存储单词 创建一个游标 循环浏览字幕表中的每一行
  • 将 WindowState 设置为最大化会导致窗口过早出现

    我读到Load事件应该在创建窗口句柄后触发 但是before窗口实际上变得可见 在大多数情况下 这似乎是正确的 但是 我发现当我使用以下命令创建表单时WindowState属性设置为FormWindowState Maximized 通过
  • 如何在 iOS 10 中安排本地通知(objective-c)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 iOS 10 安排本地通知 我想知道如何执行此操作 我查遍了网络 但我一直在寻找仅用于注册和处理通知的线索 不适用于本地通知
  • Objective C 的 self 和 C++ 的 this 之间的区别?

    有人能区分 Objective C 的 self 和 C 的 this 指针吗 主要区别在于this是一个关键字 而self是一个变量 这样做的结果是 虽然this always指正在执行特定方法的对象 Objective C 方法可以自由
  • Python,导入模块进行测试

    我很难尝试设置一个简单的测试 我的项目结构如下 project models init py user py constants py test test py 我想测试user pypy 运行test py user py from sq
  • 使用 pydub 和 AWS Lambda

    下午所有 所以我认为标题确实说了大部分内容 但这里是 我是 AWS 和 Lambda 领域的新手 并且学习这些很有趣 我正在开发一个项目 我想自动合并 S3 中的两个文件存储 我从 AWS 的查找人员那里找到了这个 lambda 函数 ht
  • android 更改微调器中项目的文本颜色

    我有一个微调器 在某些情况下某些选项不应该被选择 我有使项目不可选择的代码 但它不会使文本颜色变灰以指定该项目不可选择 如何更改微调器中应禁用的项目的文本颜色 这是代码 public class main extends Activity