我有一个具有一些特殊状态的布局(比如被检查/按下),我希望将其子设置为基于此布局应用自己的drawable。
我正在寻找另一种方法,让duplicateParentState为每个孩子(甚至可能是其所有后代)设置为真。
我试图让自定义视图具有将其设置为每个子节点的属性,但我无法找到将该属性应用于其所有子节点的方法调用。在我尝试的每种方法中,它为getChildCount()返回0或者它对子项本身没有任何作用(使用setDuplicateParentStateEnabled())。
正如文档所说,使用setDuplicateParentStateEnabled对我需要的案例不会做任何事情:
注意:在当前实现中,将此属性设置为true 视图添加到ViewGroup后可能根本没有任何效果。 此属性应始终从XML使用或在之前设置为true 将此视图添加到ViewGroup。
所以我似乎用得太迟了,但我需要把它称之为晚,因为孩子们还没有在父母身上......
如何实现避免为每个子设置duplicateParentState的功能,并将其设置为父视图?
答案 0 :(得分:0)
如何扩展小部件 - 就像你说的那样 - 并覆盖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)。