使用一个Spinner就是那种下拉框,为以后解决此问题使用同样的思路来解决。
开始它是这样的 很宽:
1)点开源码找到构造函数:
final TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.Spinner, defStyleAttr, defStyleRes);
几乎所有原生控件都含有这样的调用
context.obtainStyledAttributes()
这里就是在提取XML中定义的属性,这个
第一个参数 :attrs
The attributes of the XML tag that is inflating the view.
就是我们为这个View填充的XML的所有的属性,这个系统给分配的,XML解析方式有很多种,android怎么解析的以后研究,总之解析过来了。
第二个参数:R.styleable.Spinner
我们打开源码的Res->values->attrs.xml 找到这样定义的一个styleable,我认为它是一个属性的集合这样,而且它有个名字叫Spinner,下一级就是这个Spinner属性集合里的所有属性。就是这些<attr name= "xx" xxx/> ,这个参数就是说明只要是这个名字下的属性都过滤了出来。
<declare-styleable name="Spinner"> <!-- The prompt to display when the spinner's dialog is shown. --> <attr name="prompt" format="reference" /> <!-- Display mode for spinner options. --> <attr name="spinnerMode" format="enum"> <!-- Spinner options will be presented to the user as a dialog window. --> <enum name="dialog" value="0" /> <!-- Spinner options will be presented to the user as an inline dropdown anchored to the spinner widget itself. --> <enum name="dropdown" value="1" /> </attr> <!-- List selector to use for spinnerMode="dropdown" display. --> <attr name="dropDownSelector" /> <!-- Theme to use for the drop-down or dialog popup window. --> <attr name="popupTheme" /> <!-- Background drawable to use for the dropdown in spinnerMode="dropdown". --> <attr name="popupBackground" /> <!-- Window elevation to use for the dropdown in spinnerMode="dropdown". --> <attr name="popupElevation" /> <!-- Width of the dropdown in spinnerMode="dropdown". --> <attr name="dropDownWidth" /> <!-- Reference to a layout to use for displaying a prompt in the dropdown for spinnerMode="dropdown". This layout must contain a TextView with the id {@code @android:id/text1} to be populated with the prompt text. --> <attr name="popupPromptView" format="reference" /> <!-- Gravity setting for positioning the currently selected item. --> <attr name="gravity" /> <!-- Whether this spinner should mark child views as enabled/disabled when the spinner itself is enabled/disabled. --> <attr name="disableChildrenWhenDisabled" format="boolean" /> </declare-styleable>
第三个参数 defStyleAttr:
看到def我们知道应该是个缺省属性,这个值就是个缺省的属性,现在也用不到。
第四个参数 defStyleRes:
又是一个缺省值,我们现在不去管它。
继续看源码,找到其中一句
mode = a.getInt(R.styleable.Spinner_spinnerMode, MODE_DIALOG);看到这里就是将属性取出来,用下划线连接了连个单词, 下划线前面的Spinner ,就是刚才源码里的属性集的名字,后面的就是其中的一个属性。
这个spinnerMode属性就是控制显示的方式 是dialog还是popwindow。
final DropdownPopup popup = new DropdownPopup(mPopupContext, attrs, defStyleAttr, defStyleRes);mPopup = popup;
2)接下来就是去找设置宽度了在popMode下
mDropDownWidth = pa.getLayoutDimension(R.styleable.Spinner_dropDownWidth, ViewGroup.LayoutParams.WRAP_CONTENT);这里发现这个属性,看名字就是它了,这时候试一下就可以了。验证一下来看
3)验证 发现 show()
widthSpec = mDropDownWidth;
mPopup.setWidth(widthSpec);5)
在XML中定义的 (XML Namespaces == xmlns)名称空间android源码中定义的都是这个名称空间。
xmlns:android="http://schemas.android.com/apk/res/android"
因为解析的时候是根据名称空间来的所以是android:XX
android:dropDownWidth="100dp"
然后变成这样
都是很简单的基础,自己备忘一下。