Android开发Android技术知识Android开发

自定义控件(继承系统控件,非自绘)

2019-08-21  本文已影响12人  手指乐
  1. 写一个类继承已有的控件(比如textview),override其中的构造函数:
    一般重写这两个构造函数:
public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
   }

一个构造函数一般在代码里new这个自定义控件时使用

第二个构造函数是在layout的xml文件中声明这个控件时,自动调用,attrs里包含了在xml中给这个自定义view设置的所有属性,包括自定义属性和系统属性

  1. 在xml中声明这个自定义控件,并设置相关属性
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.example.zhouyi.userdefineattrsandstyle.MainActivity">

    <com.example.zhouyi.userdefineattrsandstyle.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
  1. 这时候,可以在其构造函数中获取这些定义的系统属性:
public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray typedArray = context.obtainStyledAttributes(attrs,
            new int[]{android.R.attr.text});
    String strValue = typedArray.getString(0);
}

obtainStyledAttributes用于在所有属性集合(attrs)中获取我们需要的属性值,第二个参数是一个int数组,里面设置我们需要获取的属性对应的资源id,比如textview的text属性其实是在android的系统资源的属性文件中设置的一个属性

  1. 使用自定义属性:
    首先在res/values底下建立一个attrs.xml文件,指定自定义属性集合的名字,以及里面的属性名和属性格式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyTextViewStyle">
        <attr name="attr_one" format="string"/>
        <attr name="attr_two" format="string" />
        <attr name="attr_three" format="string" />
        <attr name="attr_four" format="string" />
    </declare-styleable>
</resources>

在xml中定义自定义属性的命名空间并设置自定义属性:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:test = "http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.example.zhouyi.userdefineattrsandstyle.MainActivity">

    <com.example.zhouyi.userdefineattrsandstyle.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        test:attr_one="attr_one from xml"
        android:text="Hello World!" />
</RelativeLayout>

自定属性的命名空间名字可以随意,值统一为:http://schemas.android.com/apk/res-auto

在代码中获取自定义属性值:

public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray typedArray = context.obtainStyledAttributes(attrs,
            R.styleable.MyTextViewStyle);

    String strValue_one = typedArray.getString(R.styleable.MyTextViewStyle_attr_one);
}

在样式(style.xml)中给自定义属性赋值,不需要android:xxx,直接写属性名即可

<style name="ThroughStyle">
    <item name="attr_one">attr one from style</item>
    <item name="attr_two">attr two from style</item>
</style>
上一篇下一篇

猜你喜欢

热点阅读