如何修改自定义View中strHeader属性的文本颜色?
解决自定义View中strHeader文本颜色修改问题
1. 新增自定义文本颜色属性
首先在attr.xml里给StoreCustomView添加一个控制strHeader颜色的专属属性:
<declare-styleable name="StoreCustomView"> <attr name="strLimit" format="integer" /> <attr name="strHeader" format="string" /> <!-- 新增标题文本颜色属性 --> <attr name="strHeaderTextColor" format="color" /> <attr name="storeItemHeight" format="dimension" /> <attr name="storeItemWidth" format="dimension" /> <attr name="strLoader" format="boolean" /> </declare-styleable>
2. 在自定义View中接收并设置颜色
在StoreCustomView的代码里,获取新增的颜色属性,手动设置给内部显示strHeader的TextView(假设内部标题TextView的id为tv_header):
Kotlin示例:
class StoreCustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ViewGroup(context, attrs, defStyleAttr) { private lateinit var tvHeader: TextView init { // 加载自定义View布局 LayoutInflater.from(context).inflate(R.layout.view_store_custom, this, true) tvHeader = findViewById(R.id.tv_header) // 解析自定义属性 val typedArray = context.obtainStyledAttributes(attrs, R.styleable.StoreCustomView) // 设置标题文本 typedArray.getString(R.styleable.StoreCustomView_strHeader)?.let { tvHeader.text = it } // 设置标题颜色,默认用黑色兜底 val headerColor = typedArray.getColor(R.styleable.StoreCustomView_strHeaderTextColor, Color.BLACK) tvHeader.setTextColor(headerColor) // 回收TypedArray避免内存泄漏 typedArray.recycle() // 其他属性初始化逻辑... } // 自定义View的其他重写方法... }
Java示例:
public class StoreCustomView extends ViewGroup { private TextView tvHeader; public StoreCustomView(Context context) { this(context, null); } public StoreCustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public StoreCustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); LayoutInflater.from(context).inflate(R.layout.view_store_custom, this, true); tvHeader = findViewById(R.id.tv_header); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.StoreCustomView); // 设置标题文本 String headerText = typedArray.getString(R.styleable.StoreCustomView_strHeader); tvHeader.setText(headerText); // 设置标题颜色,默认黑色 int headerColor = typedArray.getColor(R.styleable.StoreCustomView_strHeaderTextColor, Color.BLACK); tvHeader.setTextColor(headerColor); typedArray.recycle(); // 其他属性初始化逻辑... } // 自定义View的其他重写方法... }
3. 在布局中使用自定义颜色属性
现在可以在fragment_home的布局里直接设置标题颜色了:
<com.test.apps.myapp.customView.StoreCustomView android:id="@+id/horizontalStoreList" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="visible" custom:storeItemHeight="@dimen/v3_store_card_height" custom:storeItemWidth="@dimen/v3_store_card_width" custom:strHeader="@string/discover_stores_nearby" custom:strLimit="6" <!-- 可以用颜色资源或十六进制色值 --> custom:strHeaderTextColor="@color/your_target_color" />
为什么之前的android:textColor无效?
android:textColor是系统TextView的专属属性,你的自定义View作为一个独立的View组件,外部设置该属性无法自动传递给内部的标题TextView,必须通过自定义属性接收颜色值后,手动绑定到内部TextView上。
内容的提问来源于stack exchange,提问作者Lord V
相关产品推荐
相关产品推荐

