当前位置:首页 > Android > 正文内容

TypedArray和obtainStyledAttributes使用

jsc11年前 (2014-08-27)Android3630

编写Android自定义按钮示例基础上,如果要指定字体大小产生这样的效果:

1.png

其实是不需要自定义变量的,可以直接使用TextView的配置属性:

        <com.easymorse.textbutton.TextButton 
             android:layout_width="fill_parent" android:layout_height="fill_parent" 
             android:layout_weight="1" android:text="电影" 
             android:gravity="center_vertical|center_horizontal" 
             android:background="@drawable/button" android:focusable="true" 
             android:clickable="true" android:textSize="22sp" />


在这里字体大小使用了sp,这里要说一下sp与dp(dip)的区别,dip是:

dp Density-independent Pixels – an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp".

不过,要是和字体有关,最好还是用sp,和dp类似,但更适合字体大小:

sp Scale-independent Pixels – this is like the dp unit, but it is also scaled by the user’s font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user’s preference.

这里为了演示使用自定义变量,字体大小改用自定义的属性。

首先要创建变量,创建了个values/attrs.xml文件,文件名任意,但是要在values目录下:

      <?xml version="1.0" encoding="utf-8"?>   
         <resources>   
             <declare-styleable name="button">   
                 <attr name="textSize" format="dimension" />   
             </declare-styleable>   
         </resources>


根标签要是resources,定义的变量要有个名字,declare-styleable name="button">,这里定义名称为button。在这个名称里,可以有多个自定义属性。定义了个名为textSize的属性,格式是 dimension,这个format指定了textSize属性的类型,只能用于定义字体大小。

布局文件中通过自定义属性赋值:

        <?xml version="1.0" encoding="utf-8"?> 
         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
             xmlns:myapp="http://schemas.android.com/apk/res/com.easymorse.textbutton" 
             android:orientation="vertical" android:layout_width="fill_parent" 
             android:layout_height="fill_parent" android:background="@drawable/background_color"> 
             <LinearLayout android:layout_width="fill_parent" 
                 android:layout_height="10dip" /> 
             <LinearLayout android:layout_width="fill_parent" 
                 android:layout_height="40dip"> 
                 <com.easymorse.textbutton.TextButton 
                     android:layout_width="fill_parent" android:layout_height="fill_parent" 
                     android:layout_weight="1" android:text="电影" 
                     android:gravity="center_vertical|center_horizontal" 
                     android:background="@drawable/button" android:focusable="true" 
                     android:clickable="true" myapp:textSize="20sp" />

这里在根标签中增加了:

xmlns:myapp=http://schemas.android.com/apk/res/com.easymorse.textbutton

声明了myapp这个名字空间,myapp是任意的名称,自己可以随便起名,后面的:

http://schemas.android.com/apk/res/

是固定的。再后面接的是应用的包名。

在下面自定义按钮中的:myapp:textSize,就是使用<attr name="textSize"这个变量了,给变量赋值。

还需要一个过程,就是在程序中获取到这个赋值:

      public TextButton(final Context context, AttributeSet attrs) { 
         this(context, attrs, 0); 
         TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.button); 
         this.setTextSize(typedArray.getDimension(R.styleable.button_textSize, 15)); 
         typedArray.recycle(); 
      }

其中,TypedArray实例是个属性的容器,context.obtainStyledAttributes()方法返回得到。 AttributeSet是节点的属性集合,在本例中是<com.easymorse.textbutton.TextButton节点中的属性集 合。

这句话:

typedArray.getDimension(R.styleable.button_textSize,
                15)

将获取自定义textSize的值,如果没有,则使用默认的值,15。

最后别忘记调用:

typedArray.recycle();

作用是:

Give back a previously retrieved StyledAttributes, for later re-use.

这里的自定义属性的format,可以有很多种:

      referenc、string、color、dimension、boolean、integer、float、fraction、enum、flag

 


扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/20.html

分享给朋友:

“TypedArray和obtainStyledAttributes使用” 的相关文章

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...

实现应用程序只有在第一次启动时显示引导界面

第一次安装启动:启动页--->导航页-->主页面之后启动:启动页-->主页面实现的原理就是:在启动页面用做一个文件保存的状态,保存程序是不是第一次启动的状态。因为只是要保存一个状态,我们将这个程序是第一次打开就将他设为true,当他进入 主页面之后将他的状态未为false,因为都...

Android采用SharedPreferences保存用户登录信息

Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用 SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared...

Android ImageView的scaleType属性与adjustViewBounds属性

Android ImageView的scaleType属性与adjustViewBounds属性

ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY android:sca...

下拉刷新及滚动到底部加载更多的Listview使用

下拉刷新及滚动到底部加载更多的Listview使用

本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用。 该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新)  b.可自定义滚动到底部响应的事件(如滑动到底部加载更多)  c.可自定义丰富的样式  d....