最近做项目需要用到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以及其父样式中都定义了什么属性。