Android中的属性,是怎么应用到控件上的(一)

使用一个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"


然后变成这样

都是很简单的基础,自己备忘一下。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值