In tutorial #4.1, I mentioned that we passed custom attributes for the text and image variables from the XML resource file to our custom class. This is a critical skill for performing true object-oriented programming and how to do it wasn’t obvious from Google’s Android API Demos.

Luckily I was pointed to the solution myself by an experienced Android programmer in Guatemala by the username of cadlg (thanks again!). If you want to see the official Google Android example though, look at Android’s APIDemos’ custom LabelView example.

So here we go. We’ll use the same code asTutorial 4.1 to keep this simple.

Setting Up Your Custom Class’s XML Resource Files

We’ll only review the code for the TextOnlyButton as it’s identical in concept to the ImageOnlyButton.

First we’ll create a new filein /res/values called attrs.xml


<?xml version=”1.0″ encoding=”utf-8″?><resources><declare-styleable name=”TextOnlyButton”><attr name=”textColorNotFocused” format=”integer”/><attr name=”textColorFocused” format=”integer”/></declare-styleable></resources>

As you see, we first declared a ’styleable’ with the name of our custom Class. Two attributes were then added to contain the values of our focused & unfocused text colors. By default, attributes have values of String, but in our case, we needed integers to represent the resource id’s we’ll declare in our colors.xml file. You can also declare formats such as “boolean” & others if that suits the requirements of your own project.

Next, we declare values for these custom attributes in our layout’s XML file: tutorial4.xml


<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”xmlns:pj=”http://schemas.android.com/apk/res/com.pocketjourney.tutorials”android:orientation=”vertical”android:layout_width=”fill_parent”android:layout_height=”fill_parent”android:padding=”10px”><com.pocketjourney.view.TextOnlyButtonandroid:id=”@+id/text_only_button”android:layout_width=”wrap_content”android:layout_height=”wrap_content”android:layout_marginTop=”5px”style=”?android:attr/buttonStyleSmall”android:text=”Text Button”pj:textColorNotFocused=”@drawable/white”pj:textColorFocused=”@drawable/android_orange” /></LinearLayout> 

Referring to our new attributes is actually a two step process. First we declared a new namespace (in our case called ‘pj’ as short for PocketJourney) in the parent layout of our custom class:

xmlns:pj=”http://schemas.android.com/apk/res/com.pocketjourney.tutorials”

Next we specified the values of our new attributes in the XML usage of our TextOnlyButton:

pj:textColorNotFocused=”@drawable/white”
pj:textColorFocused=”@drawable/android_orange”

Now you can see why we specified our format=”integer”. Our custom attributes point to the resource id’s of colors specified in our colors.xml file.

Retrieving Custom Attributes During Class Instantiation

Since our Activity has many constructors, we delegate the attribute parsing to an init() method to keep our code clean.

int notFocusedTextColor, f ocusedTextColor;


private void init(AttributeSet attrs) {Resources.StyledAttributes a = getContext().obtainStyledAttributes(attrs,R.styleable.TextOnlyButton );notFocusedTextColor = a.getColor(R.styleable.TextOnlyButton_textColorNotFocused , 0xFF000000);focusedTextColor = a.getColor(R.styleable.TextOnlyButton_textColorFocused , 0xFF000000);}

By now you’ve undoubtedly seen the AttributeSet that is always passed into an Activity. Well now you get to use it. First we obtain the StyledAttributes instance by requesting just the StyledAttributes for our custom Class. Next, we call the getColor() and pass two variables: the name of the attribute we want along with a default value in case the user did not specify one.

Take note of our styled attribute’s name as it’s a combination of our custom class’s name and the attribute we specified in the attrs.xml file (e.g.TextOnlyButton_textColorNotFocused).

And That’s It

You can now readily pass your own custom attributes and keep your View variables cleanly enclosed in your XML files. You can download thesource to see for yourself. Just look at Tutorial #4.

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. php开发一个文件管理系统(附代码)
  2. 解决CentOS7中php-fpm进程数过多导致服务
  3. php中加密解密DES的正确使用姿势
  4. CentOS 下三种 PHP 拓展安装方法
  5. PHP编译参数configure配置详解
  6. PHP使用swoole实现多线程爬虫
  7. 怎么将网站的php版本信息隐藏起来
  8. php实现性能优化
  9. 关于php中变量的初始化以及赋值方式的介
  10. 通过header函数设置响应头解决php跨域问