http://blog.csdn.net/jincf2011/article/details/6344678气死我了 这货博客坑死大爷了大爷弄了两天各种毛病

一看官网原来这玩意儿不是这么写的

官网教程:

All of the view classes defined in the Android framework extendView. Your custom view can also extendViewdirectly, or you can save time by extending one of the existing view subclasses, such asButton.

To allow theAndroid Developer Toolsto interact with your view, at a minimum you must provide a constructor that takes aContextand anAttributeSetobject as parameters. This constructor allows the layout editor to create and edit an instance of your view.

class PieChart extends View {
public PieChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
}

Define Custom Attributes

To add a built-inViewto your user interface, you specify it in an XML element and control its appearance and behavior with element attributes. Well-written custom views can also be added and styled via XML. To enable this behavior in your custom view, you must:

  • Define custom attributes for your view in a<declare-styleable>resource element

  • Specify values for the attributes in your XML layout

  • Retrieve attribute values at runtime

  • Apply the retrieved attribute values to your view

This section discusses how to define custom attributes and specify their values. The next section deals with retrieving and applying the values at runtime.

To define custom attributes, add<declare-styleable>resources to your project. It's customary to put these resources into ares/values/attrs.xmlfile. Here's an example of anattrs.xmlfile:

<resources>
<declare-styleable name="PieChart">
<attr name="showText" format="boolean" />
<attr name="labelPosition" format="enum">
<enum name="left" value="0"/>
<enum name="right" value="1"/>
</attr>
</declare-styleable>
</resources>

This code declares two custom attributes,showTextandlabelPosition, that belong to a styleable entity namedPieChart. The name of the styleable entity is, by convention, the same name as the name of the class that defines the custom view. Although it's not strictly necessary to follow this convention, many popular code editors depend on this naming convention to provide statement completion.

Once you define the custom attributes, you can use them in layout XML files just like built-in attributes. The only difference is that your custom attributes belong to a different namespace. Instead of belonging to thehttp://schemas.android.com/apk/res/androidnamespace, they belong tohttp://schemas.android.com/apk/res/[your package name]. For example, here's how to use the attributes defined forPieChart:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">
<com.example.customviews.charting.PieChart
custom:showText="true"
custom:labelPosition="left" />
</LinearLayout>

In order to avoid having to repeat the long namespace URI, the sample uses anxmlnsdirective. This directive assigns the aliascustomto the namespacehttp://schemas.android.com/apk/res/com.example.customviews. You can choose any alias you want for your namespace.

Notice the name of the XML tag that adds the custom view to the layout. It is the fully qualified name of the custom view class. If your view class is an inner class, you must further qualify it with the name of the view's outer class. further. For instance, thePieChartclass has an inner class calledPieView. To use the custom attributes from this class, you would use the tagcom.example.customviews.charting.PieChart$PieView.

Apply Custom Attributes

When a view is created from an XML layout, all of the attributes in the XML tag are read from the resource bundle and passed into the view's constructor as anAttributeSet. Although it's possible to read values from theAttributeSetdirectly, doing so has some disadvantages:

  • Resource references within attribute values are not resolved

  • Styles are not applied

Instead, pass theAttributeSettoobtainStyledAttributes(). This method passes back aTypedArrayarray of values that have already been dereferenced and styled.

The Android resource compiler does a lot of work for you to make callingobtainStyledAttributes()easier. For each<declare-styleable>resource in the res directory, the generated R.java defines both an array of attribute ids and a set of constants that define the index for each attribute in the array. You use the predefined constants to read the attributes from theTypedArray. Here's how thePieChartclass reads its attributes:

public PieChart(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs
,
R
.styleable.PieChart,
0, 0);

try {
mShowText
= a.getBoolean(R.styleable.PieChart_showText, false);
mTextPos
= a.getInteger(R.styleable.PieChart_labelPosition, 0);
} finally {
a
.recycle();
}
}

Note thatTypedArrayobjects are a shared resource and must be recycled after use.

太长了是吧 简单说一下:

自定义组件NewView继承一个View类

重写构造函数

publicNewView(Contextcontext){this(context,null);}publicNewView(Contextcontext,AttributeSetattrs){super(context,attrs);}

为了专业一点 让xml文件能配置这个组件 ,需要在values下的attrs.xml中定义一下自定义组件的参数

<?xmlversion="1.0"encoding="utf-8"?><resources><declare-styleablename="NewView"><attrname="pressedIcon"format="reference"/><attrname="buttonIcon"format="reference"/><attrname="text"format="string"/><attrname="iconSize"format="dimension"/><attrname="textSize"format="dimension"/></declare-styleable></resources>

reference 代表引用资源文件 string代表字符 color 代表颜色 dimension代表大小

好了现在可以在布局文件中引入这个组件了

<com.xxx.app.view.NewViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"app:text="@string/main_one"app:iconSize="20dp"/>

app代表属性的namespace,如果用android studio的话

根元素加上

xmlns:app="http://schemas.android.com/apk/res-auto"

如果是eclipse 需要替换成

xmlns:app="http://schemas.android.com/apk/res/包名"

然后我们在构造函数中处理这些传入的参数

TypedArraya=context.getTheme().obtainStyledAttributes(attrs,R.styleable.NewView,0,0);try{CharSequencetext=a.getText(R.styleable.NewView_text);}finally{a.recycle();}

取到的参数怎么处理 就不用说了哈


更多相关文章

  1. Android屏幕解锁和点亮
  2. Retrofit2 ,Dagger2等常用框架注解功能介绍
  3. 【转】android 有关listview的adapter的相关用法
  4. android 纯代码 详细编写布局文件
  5. [Android(安卓)Studio]设置Button的圆角、点击效果、按钮颜色
  6. 【Android基础】(1)四大核心组件之Activity
  7. android绑定点击事件的四种方法
  8. android ueventd 本地native部分源码分析
  9. Android(安卓)Service中给其他的组件回传数据。

随机推荐

  1. (推荐)Android最全开发资源(转)
  2. 布局与样式
  3. Android强行进阶—按键事件&焦点事件攻略
  4. Android 自定义对话框去除白色边框代码
  5. Android第三课 联调华为手机
  6. Android之-异步消息处理机制
  7. Android里面编写退出主程序的提示代码
  8. Android 中的ListView选中项的背景颜色怎
  9. Android 手动显示和隐藏软键盘
  10. Android 静态注册 (包括8.0以上)