自定义Android TextView的扩展与收缩样式配置详解

1 下载量 123 浏览量 更新于2024-08-29 收藏 85KB PDF 举报
在Android开发中,自定义View是提高应用复用性和灵活性的重要手段。当需要为自定义视图(如TextView)添加可配置的样式属性,如图片资源、字体大小和控件属性时,TypedArray类是一个不可或缺的工具。本文将详细介绍如何在自定义的可点击扩展和收缩的TextView中使用TypedArray来配置这些样式。 首先,让我们通过一个实际的例子来理解这个过程。假设我们创建了一个名为`ExpandTextView`的自定义控件,它继承自`LinearLayout`并实现了`OnClickListener`接口,允许用户通过点击来扩展或收缩显示的内容。这个视图的样式可以被预设为展开图片、收起图片以及最小展示的行数,这些都可以通过`ExpandTextViewStyle`这个样式类进行配置。 自定义的`ExpandTextView`类包含以下关键成员变量: 1. `defaultMinLines`:表示默认情况下最小显示的行数。 2. `mCollapsed`:用于标记当前状态,是否处于折叠状态。 3. `mRelayout`:标志是否需要在状态改变后重新布局视图。 4. `expandView`:用于存储扩展视图的部分。 5. `expandText`:TextView用于显示文本内容。 6. `expandImg`:ImageView用来显示展开和收起的图片。 7. `mExpandDrawable`和`mCollapseDrawable`:分别保存展开和收起时的drawable资源。 初始化方法`init()`中,会从`attrs`中读取XML中的配置,并使用LayoutInflater来 inflate布局资源`R.layout.pt__expand_textview`。在这个过程中,我们可以使用`TypedArray`来获取和解析XML中的样式属性。 `TypedArray`是一个用于操作XML属性数组的类,它能帮助我们在运行时动态获取和设置资源引用。例如,对于自定义的图片资源,我们可以在`init()`方法中这样操作: ```java TypedArray ta = context.getTheme().obtainStyledAttributes( attrs, R.styleable.ExpandTextView, 0, 0); try { int expandResId = ta.getResourceId(R.styleable.ExpandTextView_expandImage, 0); mExpandDrawable = ContextCompat.getDrawable(context, expandResId); int collapseResId = ta.getResourceId(R.styleable.ExpandTextView_collapseImage, 0); mCollapseDrawable = ContextCompat.getDrawable(context, collapseResId); } finally { ta.recycle(); } ``` 这里,`obtainStyledAttributes()`方法接收四个参数:要解析的`AttributeSet`、XML中的主题资源类型数组、初始索引和终止索引。通过`getResourceId()`方法,我们从`TypedArray`中获取到对应的图片资源ID,然后利用`ContextCompat.getDrawable()`将其转换为Drawable对象。 类似地,对于文本颜色、字体大小等其他属性,也可以使用类似的方式从`TypedArray`中获取。配置完成后,当用户点击`ExpandTextView`时,可以根据`mCollapsed`的状态切换显示的图片和调整TextView的行数,同时更新UI以反映新的样式。 总结来说,自定义`ExpandTextView`通过`TypedArray`来管理样式属性,使得开发者能够方便地为视图提供可配置的外观选项,增强了应用的灵活性和用户体验。这种设计模式在Android开发中非常常见,对于实现模块化和重用性有着重要作用。