关于android 控件的默认属性问题

每个控件都有很多属性 而对于一些属性会有其默认值  而这些默认值是哪里来的?

我们会想到style或者theme 可往往我们使用TextView或者一些常用的控件的时候并没有声明 style属性 或者theme属性啊

下面以最常用的TextView来进行分析

我们知道 开发中缩写的xml 布局文件 最后都会被解析成为一个对象

势必会调用构造方法来创建对象

下面我们来看看TextView的构造方法

<span style="font-size:14px;">    public TextView(Context context) {
        this(context, null);
    }

    public TextView(Context context,
                    AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.textViewStyle);
    }

    @SuppressWarnings("deprecation")
    public TextView(Context context,
                    AttributeSet attrs,
                    int defStyle) {
        super(context, attrs, defStyle);
       .....

        TypedArray a =
            context.obtainStyledAttributes(
                attrs, com.android.internal.R.styleable.TextView, defStyle, 0);

      .......
        }</span>

TextView 共有3个构造方法         android提供的控件 都会有3个构造方法

第一个构造方法 需要我们传入一个Context对象 一般用于在代码中创建对象

而第二三个构造方法   则是在xml解析成对象时调用

当控件没有指定style时调用第二个构造方法

指定了style时调用第三个

对于TextView 我们一般不指定style 此时就会调用第二个构造方法

<span style="font-size:14px;"> public TextView(Context context,
                    AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.textViewStyle);
    }
</span>

可以看到这里调用了第三个构造方法

<span style="font-size:14px;">public TextView(Context context,
                    AttributeSet attrs,
                    int defStyle) {}</span>

分析一下参数:

context   是上下文环境    由系统提供

attrs   是解析xml文件中 控件的属性(id,layout_height等)得来的 可以视为一个容器

defStyle 是第二个构造函数传进来的

com.android.internal.R.attr.textViewStyle

可以看出这是一个id引用对象 在系统attr.xml文件中定义

<span style="font-size:14px;">   <!-- Default TextView style. -->
        <attr name="textViewStyle" format="reference" /></span>

由此可知当我们没有为控件指定style时 会使用一个默认style

那么这个默认style从哪来的啊 我们也并没有为这个textViewStyle设定值啊 ?

答案是 在activity的theme中指定了textViewStyle

<span style="font-size:14px;"> <style name="Theme">
   <item name="textViewStyle">@android:style/Widget.TextView</item></span>

定义在了Theme中 而Theme是所有theme的基类 所以无论activity 的theme是什么 都可以找到textViewStyle

@android:style/Widget.TextView

这个表示引用系统style资源Widget.TextView

<span style="font-size:14px;">    <style name="Widget.TextView">
        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
        <item name="android:textSelectHandleLeft">?android:attr/textSelectHandleLeft</item>
        <item name="android:textSelectHandleRight">?android:attr/textSelectHandleRight</item>
        <item name="android:textSelectHandle">?android:attr/textSelectHandle</item>
    </style></span>

以上就是Textview的默认属性了

总结:

控件的默认值在style中指定

当不指定控件style  会使用默认的style

而默认的style的值则在theme中指定

下面分析

<span style="font-size:14px;">TypedArray a=context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView, defStyle, 0);</span>

这个obtainStyledAttributes可以理解为使用attrs 和defStyle 对com.android.internal.R.styleable.TextView中的属性进行解析

我们知道 attrs是xml布局文件中控件指定的属性值 而defStyle 是style中指定属性值

而com.android.internal.R.styleable.TextView 是在scheme中即attrs.xml中定义的属性

所以把attrs 和defStyle的值匹配到com.android.internal.R.styleable.TextView的属性上

<span style="font-size:14px;">                mThumbDrawable = a.getDrawable(R.styleable.Switch_thumb);
		mTrackDrawable = a.getDrawable(R.styleable.Switch_track);
		mTextOn = a.getText(R.styleable.Switch_textOn);
		mTextOff = a.getText(R.styleable.Switch_textOff);</span>

最后通过以上代码得到属性值

时间: 2024-09-30 16:40:52

关于android 控件的默认属性问题的相关文章

Android 控件布局常用属性

<!--单个控件经常用到android:id -- 为控件指定相应的IDandroid:text -- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串android:grivity -- 指定控件的基本位置,比如说居中,居右等位置android:textSize -- 指定控件当中字体的大小android:background -- 指定该控件所使用的背景色,RGB命名法 android:width -- 指定控件的宽度android:height --

关于Android控件EditText的属性InputType的一些经验,java组合多个参数

关于Android控件EditText的属性InputType的一些经验 2013-11-14 15:08:02|  分类: 默认分类|举报|字号 订阅 1.InputType属性在代码中的设置必须放在setSingleLine()函数之后,否则无效: 2.关于InputType属性xml与代码的对应值如下: android java代码设置EditText输入格式参数对应Description列 setInputType(XXXXXXXX)或者setRawInputType(XXXXXXXX)

Android 控件的一些属性--持续更新中...

归纳一些冷门又可能用到的Android控件属性 1.ListView android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到 android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的 取消分割线/分隔线 android:divider="@null" listvi

Android控件所共有属性ID、宽、高、背景、内容位置、状态、内容跟边界的间隙、边界跟其他控件边界的间隙

Android控件(包括布局)的所共有的属性: android:id="@+id/denglu_et_name"                     设置控件的id,denglu_et_name可以替换成你需要的id号名称 android:layout_width="wrap_content"        设置控件的宽 android:layout_height="wrap_content"       设置控件的高            

Android控件常见属性

1.宽/高android:layout_width android:layout_height// 取值match_parent //匹配父控件wrap_content //自适应,根据内容 如果指定宽度,请用单位dp 2.控件在父控件中的对齐位置android:layout_gravity 3.控件中文本的对齐方式android:gravity 4.控件内元素的排列方式android:orientation 取值:horizontal 水平 vertical 垂直 5.文字大小 android

android (4)控件的xml属性

android:id 为控件指定相应的ID. android:text 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串. android:textSize 指定控件当中字体的大小. android:background 指定该控件所使用的背景色或背景图,RGB命名法. android:width 指定控件的宽度. android:height 指定控件的高度. android:sigleLine 如果设置为真的话,则控件的内容在同一行中进行显示. and

Android培训准备资料之UI一些相似控件和控件一些相似属性之间的区别

这一篇博客主要收集五大布局中的一些相似控件和控件一些相似属性之间的区别 ImageView ImageButton Button 三者有啥区别? (1)Button继承自TextView,ImageView继承自View,ImageButton继承自ImageView                                              (2)Button支持android:text属性,而ImageButton和ImageView不支持,但是ImageView和ImageB

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: ?android:duplicateParentState="true"

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: android:duplicateParentState="true" 来自为知笔记(Wiz)

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w