最近做项目需要用到AutoCompleteTextView这个控件,而其下拉框的滚动条有点难看,于是想去掉。走了些弯路,终于弄通了。

首先先介绍一种不靠谱的方法:反射机制

为什么会有人想到用这个呢?

打开AutoCompleteTextView的源码我们可以看到,其实这个控件是由EditText和Listview组成的。

AutoCompleteTextView继承EditText,DropDownListView继承Listview,DropDownListView则为AutoCompleteTextView的成员变量

public class AutoCompleteTextView extends EditText implements Filter.FilterListener {
....
private DropDownListView mDropDownList;
....
private static class DropDownListView extends ListView {
....
 }
}

看着似乎挺有道理,但是博主我试了好多次,都没能成功。也许我方法不对,还请成功了的大牛指教。

而事实上,这种方法是不恰当的。原因如下:

原因一:

DropDownListView 为其私有的内部类,私有内部类作成员变量,反射得到的结果总是为null。

原因二:

在安卓4.0之前,DropDownListView 为AutoCompleteTextView的私有内部类,mDropDownList为其成员变量
在安卓4.0之后,DropDownListView 为ListPopupWindow的私有内部类,mDropDownList为ListPopupWindow成员变量
看到这,请问你还要用反射吗?如果安卓5.0之后,DropDownListView 又变了呢?我们应该如何兼容所有安卓平台的机器呢?

真正靠谱的方法应该是通过主题来设置。
这个方法基于源码中的一段代码而提出的

        public DropDownListView(Context context) {
super(context, null, com.android.internal.R.attr.dropDownListViewStyle);
}

DropDownListView从一开始就使用了一个属性,而这个属性控制着其样式。
因此,这是我们的切入点

首先,在styles.xml中定义一个样式,其继承自ListView.DropDown,其中的两个item分别指定了滚动条隐藏和分割线。dropdown_divider是我定义的一个shape,这个很简单,自行定义

    <!-- styles.xml -->
<style name="widget_dropdownlistview" parent="android:style/Widget.Holo.ListView.DropDown">
<item name="android:scrollbars">none</item>
<item name="android:divider">@drawable/dropdown_divider</item>
</style>

接着,我们创建一个主题,在这个主题中设置dropDownListViewStyle属性的值为我们刚才定义的风格样式。这个属性用于控制DropdownList的样式的,通过设置这个属性,从而实现控制DropdownList

<!-- themes.xml -->
<style name="DropDownListView_NoScrollbar" parent="android:style/Theme.NoTitleBar">
<item name="android:dropDownListViewStyle">@style/widget_dropdownlistview</item>
</style>

最后,我们只要把这个主题应用到我们用了AutoCompleteTextView的Activity中就可以了。

这里我在Android Mainifest.xml中指定

<!-- Mainifest.xml -->
<activity android:name="com.exmaple.MainActivity" android:theme="@style/DropDownListView_NoScrollbar"/>

通过以上设置,实现了AutoCompleteTextView下拉框隐藏滚动条,这也只是抛砖引玉,大家还可以通过样式控制下拉框的很多属性。具体的大家可以去看看ListView.DropDown以及其父样式中都定义了什么属性。

隐藏AutoCompleteTextView下拉框的滚动条的更多相关文章

  1. java下拉框,滚动条

    package com.soft.test; /** * 下拉列表.下拉框.滚动条的使用 */ import javax.swing.*; import java.awt.*; public clas ...

  2. 隐藏select下拉框的三角按钮

    修改select标签的appearance属性,改成inherit,而不是none. -moz-appearance:inherit;/*?Firefox?*/ -webkit-appearance: ...

  3. easyUI combobox下拉框很长,easyUI combobox下拉框如何显示滚动条的解决方法

    如下图,combobox下拉框里内容很多时,会导致下拉框很长,很不美观. 如何使得combobox下拉框显示滚动条 方法:把属性panelHeight:"auto"注释掉即可. $ ...

  4. 下拉框选择blur与click冲突问题

    缘由:今天在做下拉框选择时,遇到click和blur冲突问题:具体现象如下 1.intput框获取焦点(focus事件)时显示隐藏的下拉框,失去焦点(blur事件)则隐藏下拉框 2.点击选择(clic ...

  5. 纯原生javascript下拉框表单美化实例教程

    html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道.但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如 ...

  6. 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域

    我在之前的一篇博文中eaeyui-combobox实现组合查询(即实现多个值得搜索)地址:http://www.cnblogs.com/dushan/p/4778897.html 实现了select下 ...

  7. 关于java 获取 html select标签 下拉框 option 文本内容 隐藏域

    在HTML中从多选下拉框中提取已选中选项的文本内容到后台,被这个问题难倒了. demo.jsp文件 <select id="selecttype" name"typ ...

  8. FineReport——JS二次开发(隐藏下拉框控件的倒三角)

    在对FR控件进行二次开发的过程中,需要自定义样式,比如下拉框控件带有自动检索的功能,但是又希望它的显示样式如同文本框一样,这时就需要隐藏多余的部分. 在对在线文档的查阅中可以发现很多选择器适用于多种控 ...

  9. 对于隐藏性质的非标准的动态 id 的下拉框,如何定位和选中

    今天,在页面上碰到一个非 select 标签的下拉框,打算进行定位和模拟选中. <input aria-invalid="false" autocomplete=" ...

随机推荐

  1. ViewPager实现启动引导页面(个人认为很详细)

    效果如图: 启动页面是一张图片+延时效果,这里就不给出布局文件了. WelcomeActivity分析:在启动页面检测是否是第一次运行程序,如果是,则先跳转到引导界面的Activity——AndyVi ...

  2. Cpu实验

    实验十一.基于符合ISO/IEC 7816 标准协议的CPU卡RATS.PPS请求指令操作 实验目的 1.学习和了解ISO/IEC 7816标准. 2.学习和了解ATS各字节的具体定义. 3.学习和了 ...

  3. BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  4. 在VC6.0中能不能使用Duilib界面库呢?

    Duilib库的源代码是在vs2010下编译的,一般适用于vs2008及以上的版本开发使用,那么duilib能不能在vc6.0的工程中使用呢?如何在vc6.0中使用duilib库呢? 今天,由于工作要 ...

  5. docker学习笔记12:Dockerfile 指令 ENTRYPOINT介绍

    本文介绍Dockerfile的 ENTRYPOINT指令的含义. 先回顾下CMD指令的含义,CMD指令可以指定容器启动时要执行的命令,但它可以被docker run命令的参数覆盖掉. ENTRYPOI ...

  6. C#后台代码编写图片地址Properties.Resources._1;

    if (i == 0)            {                pictureBox1.Image = Properties.Resources._1;                ...

  7. linux环境ubuntu: pushd: not found

    编译错误: /bin/sh: 1: pushd: not found的问题 http://www.cnblogs.com/wansui/p/4230869.html 查看原因:进入/bin目录,查看s ...

  8. nm命令

    它用来列出一个目标文件中的各种符号. nm命令还是比较简单而且强大的.它用来列出一个目标文件中的各种符号.符号的种类很多,以下是一些常见的符号类型 nm输出字符 含义 R Read only symb ...

  9. 基于visual Studio2013解决C语言竞赛题之0908文件合并

       题目

  10. boost/lexical_cast.hpp的简单使用方法_行动_新浪博客

    boost/lexical_cast.hpp的简单使用方法_行动_新浪博客     boost/lexical_cast.hpp的简单使用方法    (2010-03-19 16:31:13)    ...