创建自定义控件属性及三个构造方法详解

找到组织 发布于 2013/11/20 12:13
阅读 3K+
收藏 1

今天在创建自定义控件时想看看三个构造方法的区别于是乎引起了下文:

首先做个普及自定义控件和属性的具体流程直接上代码:

首先创建一个自己的类(控件名称)

public class myView extends FrameLayout {

private TextView text;

private ImageView image;

public myView(Context context) {

this(context, null);

}

public myView(Context context, AttributeSet attrs) {

super(context, attrs);

LayoutInflater.from(context).inflate(R.layout.my_view, this, true);

text = (TextView) findViewById(R.id.text);

image = (ImageView) findViewById(R.id.image);

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

setText(typedArray.getString(R.styleable.xulong_view_text));

}

public myView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public void setText(String tex) {

text.setText(tex);

}

public void setImage(int imag) {

image.setBackgroundResource(imag);

}

}

layout文件很简单就像普通的layout一样:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    style="@style/myStyle" >

<TextView 

    android:id="@+id/text"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content" />

<ImageView

    android:id="@+id/image"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content" />    

</LinearLayout>

自定义属性文件:

<?xml version="1.0" encoding="utf-8"?>

<resources>


    <declare-styleable name="xulong_view">  

        <attr name="textColor" format="color"/>  

        <attr name="textSize" format="dimension"/>  

        <attr name="text" format="string"/>

        <attr name="background" format="reference"/>  

        <attr name="focusable" format="boolean"/>  

    </declare-styleable>

</resources>

之后就是在activity中使用了直接用就行了:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myView view= (myView) findViewById(R.id.myView);

view.setImage(R.drawable.ic_launcher);

}

layout文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    xmlns:my= "http://schemas.android.com/apk/res/com.example.myview"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

    

    <com.myview.myView 

        android:id="@+id/myView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        my:text= "1234569"

        ></com.myview.myView>

</RelativeLayout>

好了到此自定义控件及其属性就完成了,但是在这个使用过程中会有点小问题,如果你的自定义控件是没有layout文件的那么看http://developer.android.com/reference/android/view/View.html#View的时候会说直接调用第一个view的构造方法就ok,但是如果你是用的layout文件定义的你的控件那么你就需要使用第二个构造方法来实现你的控件,这都很正常但是到第三个时候doc上说是你有自己的style的时候可以指定你的style给第三个参数,但是我指定了之后还是不行只有是设置的style属性之后才能生效,这是为什么呢,到View得源码看到是因为你不管怎么制定最后都是拿的0,也就是你指定在layout文件style,或者是默认的style。所以第三个构造方法我觉得没有。欢迎大家讨论啊。

加载中
返回顶部
顶部