隐藏AutoCompleteTextView下拉框的滚动条
2013-07-16 20:01
239 查看
最近做项目需要用到AutoCompleteTextView这个控件,而其下拉框的滚动条有点难看,于是想去掉。走了些弯路,终于弄通了。
首先先介绍一种不靠谱的方法:反射机制
为什么会有人想到用这个呢?
打开AutoCompleteTextView的源码我们可以看到,其实这个控件是由EditText和Listview组成的。
AutoCompleteTextView继承EditText,DropDownListView继承Listview,DropDownListView则为AutoCompleteTextView的成员变量
看着似乎挺有道理,但是博主我试了好多次,都没能成功。也许我方法不对,还请成功了的大牛指教。
而事实上,这种方法是不恰当的。原因如下:
原因一:
DropDownListView 为其私有的内部类,私有内部类作成员变量,反射得到的结果总是为null。
原因二:
在安卓4.0之前,DropDownListView 为AutoCompleteTextView的私有内部类,mDropDownList为其成员变量
在安卓4.0之后,DropDownListView 为ListPopupWindow的私有内部类,mDropDownList为ListPopupWindow成员变量
看到这,请问你还要用反射吗?如果安卓5.0之后,DropDownListView 又变了呢?我们应该如何兼容所有安卓平台的机器呢?
真正靠谱的方法应该是通过主题来设置。
这个方法基于源码中的一段代码而提出的
DropDownListView从一开始就使用了一个属性,而这个属性控制着其样式。
因此,这是我们的切入点
首先,在styles.xml中定义一个样式,其继承自ListView.DropDown,其中的两个item分别指定了滚动条隐藏和分割线。dropdown_divider是我定义的一个shape,这个很简单,自行定义
接着,我们创建一个主题,在这个主题中设置dropDownListViewStyle属性的值为我们刚才定义的风格样式。这个属性用于控制DropdownList的样式的,通过设置这个属性,从而实现控制DropdownList
最后,我们只要把这个主题应用到我们用了AutoCompleteTextView的Activity中就可以了。
这里我在Android Mainifest.xml中指定
通过以上设置,实现了AutoCompleteTextView下拉框隐藏滚动条,这也只是抛砖引玉,大家还可以通过样式控制下拉框的很多属性。具体的大家可以去看看ListView.DropDown以及其父样式中都定义了什么属性。
首先先介绍一种不靠谱的方法:反射机制
为什么会有人想到用这个呢?
打开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以及其父样式中都定义了什么属性。
相关文章推荐
- jQuery Autocomplete plugin 当出现滚动条时不能隐藏弹出层解决方案
- 在 IE 浏览器中,使用 bootstrap 使得页面滚动条浮动显示,自动隐藏,自动消失
- 隐藏横向或纵向滚动条
- MFC CListCtrl控件隐藏滚动条但是保留用鼠标滚轮滚动效果的方法
- Extjs 显示或隐藏滚动条
- AutoCompleteExtender增加滚动条效果
- HTML - 隐藏滚动条但可以滚动
- work_weipa_隐藏滚动条
- android 隐藏ListView滚动条
- android--UIWebView--隐藏滚动条(解决方案)
- frameset, iframe, frame框架页面出现横向滚动条bug的隐藏方法
- 在iframe中隐藏横向滚动条的方法大全
- 隐藏UIScrollView的滚动条的方法
- JS弹出层遮罩,隐藏背景页面滚动条细节优化
- IE10/11 滚动条自动隐藏~
- ListView隐藏右侧滚动条
- 页面样式,隐藏竖滚动条,修改下拉框placeholder样式,以及父元素清除浮动
- 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)---转载
- Android TextView多行文本滚动实现与ScrollView的滚动条为隐藏的方法