隐藏AutoCompleteTextView下拉框的滚动条


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

原文地址:https://www.cnblogs.com/javawebsoa/p/3194214.html