zoukankan      html  css  js  c++  java
  • 隐藏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以及其父样式中都定义了什么属性。

  • 相关阅读:
    java小知识点8
    MongoDB执行计划分析详解(1)
    面对Schema free 的MongoDB,如何规范你的schema
    Mongodb简介
    编程之法:面试和算法心得(最大连续乘积子串)
    编程之法:面试和算法心得(荷兰国旗)
    编程之法:面试和算法心得(奇偶调序)
    编程之法:面试和算法心得(最大连续子数组和)
    编程之法:面试和算法心得(寻找和为定值的多个数)
    744. Find Smallest Letter Greater Than Target
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3194214.html
Copyright © 2011-2022 走看看