下面是图文详解自定义View视图的属性及引用的完整攻略。
一、什么是自定义View
自定义View是指用户自己编写View组件的过程。Android系统为我们提供了许多基础View组件,但它们并不能完全满足我们的需求。当我们需要一个独特的、不在基础View组件中存在的View组件时,就需要使用自定义View。
二、自定义View的属性
我们可以在自己编写的自定义View中定义属性,用于在XML布局文件中声明和设置,使得自定义View可以在XML布局文件中灵活使用。在自定义View的代码中,我们需要使用一下两种方法来定义自定义View的属性:
1.在xml文件中定义属性
在自定义View的代码中,我们需要使用declare-styleable
来定义自定义View的属性,在res/values/attrs.xml中添加如下代码:
<declare-styleable name="MyCustomView">
<attr name="my_attribute_one" format="string" />
<attr name="my_attribute_two" format="integer" />
</declare-styleable>
上面代码中,我们定义了两个自定义属性“my_attribute_one”和“my_attribute_two”,分别以string和integer的格式进行定义。这样,我们在XML布局文件中声明自定义View时,就可以使用这两个自定义属性了。
2.在自定义View中获取属性值
我们在XML布局文件中声明的自定义属性,可以在自定义View中直接获取。我们可以在自定义View的代码中使用以下方法获取自定义属性值:
val a = context.theme.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0)
val myAttributeOne = a.getString(R.styleable.MyCustomView_my_attribute_one)
val myAttributeTwo = a.getInt(R.styleable.MyCustomView_my_attribute_two, 0)
a.recycle()
上面代码中,我们通过调用obtainStyledAttributes
方法获取所有在XML布局文件中声明的自定义属性,然后使用getString
和getInt
方法来获取自定义属性值。需要注意的是,我们需要在获取完自定义属性之后调用recycle
方法来回收资源,避免内存泄漏。
三、自定义View的引用
在XML布局文件中使用自定义View,需要满足以下两个条件:
-
在XML布局文件中声明自定义View
-
在自定义View的代码中实现构造方法
下面,我们通过以下两个示例来详细讲解自定义View的引用。
示例一:自定义View显示TextView
我们可以编写一个自定义View来显示一个TextView,具体步骤如下:
首先,在res/layout/中新建一个XML布局文件custom_textview_layout.xml
,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="@color/colorPrimary"
android:gravity="center"
android:orientation="vertical">
<com.example.mydemo.views.CustomTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"
app:textColor="@color/colorWhite" />
</LinearLayout>
上面代码中,我们在LinearLayout中声明了一个自定义ViewCustomTextView
,并声明了一个自定义属性textColor
用于设置TextView的字体颜色。
接下来,在res/layout/中新建一个TextView的XML布局文件textview_layout.xml
,代码如下:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
这里,我们将自定义属性中声明的textColor
设置到TextView上,代码如下:
class CustomTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private val mTextView: TextView
init {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.textview_layout, this, false)
addView(view)
mTextView = view.findViewById(R.id.my_textview)
val a = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView)
val textColor = a.getColor(R.styleable.CustomTextView_textColor, 0)
mTextView.setTextColor(textColor)
a.recycle()
}
}
在上面的代码中,我们在构造方法中获取了XML布局文件中声明的自定义属性textColor
,然后将其设置到TextView上。
现在,我们运行程序,可以看到一个背景为蓝色、字体颜色为白色的TextView。
示例二:自定义View显示自定义属性
我们可以编写一个自定义View显示自定义属性,使得XML布局文件传入什么属性值,自定义View就显示什么属性值。具体步骤如下:
首先,我们需要在res/values/attrs.xml中声明一个自定义属性my_attribute
,代码如下:
<declare-styleable name="CustomView">
<attr name="my_attribute" format="string" />
</declare-styleable>
下面,我们新建一个XML布局文件custom_view_layout.xml
,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:gravity="center"
android:orientation="vertical">
<com.example.mydemo.views.CustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:my_attribute="这是自定义属性的值" />
</LinearLayout>
在这个XML布局文件中,我们声明了CustomView
,并传入了一个自定义属性my_attribute
。
接下来,我们在自定义View的代码中获取这个自定义属性,并将其设置到TextView上,代码如下:
class CustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private val mTextView: TextView
init {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.textview_layout, this, false)
addView(view)
mTextView = view.findViewById(R.id.my_textview)
val a = context.obtainStyledAttributes(attrs, R.styleable.CustomView)
val myAttribute = a.getString(R.styleable.CustomView_my_attribute)
mTextView.text = myAttribute
a.recycle()
}
}
在上面的代码中,我们在构造方法中获取XML布局文件中声明的自定义属性my_attribute
,然后将其设置到TextView上。
现在,我们运行程序,可以看到一个背景为蓝色、字体为这是自定义属性的值
的自定义View。
四、小结
通过本文的讲解,我们可以了解到自定义View如何去定义属性以及引用。自定义View中定义属性的方式可以通过在xml文件中定义或者在样式文件中定义,其中,样式文件中的定义,可以直接以style的方式继承。自定义View的引用,可以通过xml文件实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图文详解自定义View视图的属性及引用 - Python技术站