4

子ビューがその親の押された状態または選択された状態をコピーするのを防ぐ方法を求める SO に関する多くの質問があります。ただし、ここでは逆の方法を求めています:) - アプリの1つで非常に奇妙な動作を見ました:

4.0.4 デバイス (API 15) でアプリを実行すると、私が見た動作は明らかなデフォルトと一致しました。つまり、親はその状態をすべての子ビューに転送します。

より高い API レベル (Android 4.4) で何も変更せずに同じアプリを実行すると、この動作が変わります: 親はその状態を転送しません。

関連するすべての子ビューの xml レイアウトを導入duplicateParentStateしましたが、ここでは役に立たないようです。

これは既知の「問題」ですか、それとも API 15 から API >> 15 への動作の計画的な変更ですか?
状態がすべての API レベルで適切に転送されるようにするにはどうすればよいですか?

ここで役立つ/関連性がある場合: 親の状態を複製したいサブビューは、ImageViewtintColors を追加するカスタムです - 動作は 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)));
    }
}
4

1 に答える 1

3

私は解決策を見つけました:

ImageView上記のサブクラスを見ると、コンストラクターでclickable&focusableが に設定されていtrueます。

これが間違いだったことが判明しました。子自体がクリック可能な場合、親はその状態を転送しません。- 上記のコードが 4.0.4 では機能するのに 4.4 では機能しない理由がまだ説明されていません。

とにかく、残すことclickable & focusable = falseで問題は解決します。

于 2014-12-01T23:34:45.737 に答える