Android将父视图的“已按下”状态传递给子视图

时间:2014-12-01 21:46:41

标签: android xml-layout

这里有很多问题要求阻止子视图复制其父母按下或选择状态的方法。 但是,我在这里要求相反的方式:) - 我在我的一个应用程序中看到了一个非常奇怪的行为:

在4.0.4设备(API 15)上运行应用程序时,我看到的行为符合明显的默认值,即:父级将其状态转发到其所有子视图。

在较高的API级别(Android 4.4)上运行相同的应用程序时没有任何更改时,此行为会更改:父级不会转发其状态。

我在xml布局中为所有相关的子视图引入了duplicateParentState,但这似乎没有帮助。

这是一个已知的“问题”还是从API 15到API的行为的计划变更>> 15?
如何确保在所有API级别上正确转发状态?

如果它有任何帮助/相关性:我想要复制其父项状态的子视图是一个自定义ImageView,它添加了tintColors - 由于4.0.4上的行为是正确的,所以不应该有任何错误这堂课?

public class INCImageView extends ImageView {

    private int _tintColor;
    private int _highlightedTintColor;
    private int _selectedTintColor;

    public INCImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        this.setFocusable(true);
        this.setClickable(true);

        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.INCImageView);

        _tintColor = array.getInt(R.styleable.INCImageView_tintColor, getResources().getColor(R.color.inc_tint));
        this.setColorFilter(_tintColor);

        _selectedTintColor = array.getInt(R.styleable.INCImageView_selectedTintColor, _tintColor);
        _highlightedTintColor = array.getInt(R.styleable.INCImageView_highlightedTintColor, _tintColor);

        array.recycle();
    }

    @Override
    public void setSelected(boolean selected) {
        super.setSelected(selected);

        this.setColorFilter((selected ? _selectedTintColor : _tintColor));
    }

    @Override
    public void setPressed(boolean pressed) {
        super.setPressed(pressed);

        this.setColorFilter((pressed ? _highlightedTintColor : (this.isSelected() ? _selectedTintColor : _tintColor)));
    }
}

1 个答案:

答案 0 :(得分:2)

我找到了解决方案:

如果您查看上面的ImageView子类,请在构造函数clickable& focusable设置为true

原来这是错误的。当孩子本身可点击时,父母将不会转发其状态。 - 这仍然无法解释为什么上面的代码适用于4.0.4但是在4.4上发生了

无论如何,让clickable & focusable = false解决问题。