我有一个具有一些特殊状态(例如被选中/按下)的布局,我希望设置其子级以基于此布局应用自己的可绘制对象。
我正在寻找一种替代方案,将 duplicateParentState 设置为 true ,为其每个子级(甚至可能是其所有后代)。
我尝试使自定义视图具有将其设置到其每个子视图的属性,但我找不到在哪个方法调用中将此属性应用于其所有子视图。在我尝试过的每种方法中,它要么为 getChildCount() 返回 0,要么对子级本身不执行任何操作(使用 setDuplicateParentStateEnabled() )。
正如文档所说,使用 setDuplicateParentStateEnabled 对我需要它的情况不会做任何事情:
注意:在当前实现中,将此属性设置为 true 将视图添加到 ViewGroup 后可能根本没有任何效果。 此属性应始终从 XML 使用或在之前设置为 true 将此视图添加到 ViewGroup 中。
所以看来我用它太晚了,但我需要晚点调用它,因为孩子在父母中还不存在......
如何实现避免为每个子视图设置duplicateParentState,而只需将其设置到父视图的功能?
如何扩展小部件(就像你说的那样)并覆盖 onLayout()?这样您就可以确保在第一次绘制小部件时修改子级状态。当 onLayout() 被调用时, getChildCount() 将始终返回子级的实际数量。例如:
public class LinearLayout extends android.widget.LinearLayout {
private static final int[] VIEW_GROUP_ATTRS = new int[]{ android.R.attr.enabled };
private static final boolean DEFAULT_IS_ENABLED = true;
private boolean isEnabled = DEFAULT_IS_ENABLED;
public LinearLayout(Context context) {
super(context);
}
public LinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
isEnabled = context.obtainStyledAttributes(attrs, VIEW_GROUP_ATTRS).getBoolean(0, DEFAULT_IS_ENABLED);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
this.isEnabled = enabled;
for (int i = 0; i < getChildCount(); ++i) {
getChildAt(i).setEnabled(enabled);
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
setEnabled(isEnabled);
}
}
请注意,您实际上是在扩展小部件(在任何被覆盖的方法上调用 super)。