协调父母和孩子之间的可绘制状态

时间:2017-04-16 18:14:02

标签: android android-layout android-view drawable statelistdrawable

我有一个自定义视图LockButton,它只是一个包含两个特定子视图的FrameLayout。它包含ImageButton以及一种自定义视图ProgressIndicator。这个问题围绕着LockButton和ImageButton的行为。特别是我在LockButton中添加了一个自定义状态。 ImageButton的源代码为StateListDrawable,背景为ColorStateList。

问题是当我在LockButton中更改状态时,该更改未显示在ImageButton中

State Changes

我做错了什么?

LockButton类:

public class LockButton extends FrameLayout {

    private static final int[] STATE_LOCKED = {R.attr.state_locked};
    private boolean locked = true;

    View button;

    public LockButton(@NonNull Context context) {
        this(context, null);
    }

    public LockButton(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.lock_button, this);
        button = findViewById(R.id.lock_button_actual);

    }

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        button.setOnClickListener(l);
    }


    @Override
    public int[] onCreateDrawableState(int extraSpace) {

        final int[] drawableState;
        if(locked){
            drawableState = super.onCreateDrawableState(extraSpace + 1);
            mergeDrawableStates(drawableState, STATE_LOCKED);
        } else {
            drawableState = super.onCreateDrawableState(extraSpace);
        }
        return drawableState;
    }

    public void lock(boolean locked) {
        if(this.locked != locked) {
            this.locked = locked;
        }
        refreshDrawableState();
        button.refreshDrawableState();

    }

    public static class ProgressCircle extends View {...}

}

LockButton布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:state_locked="true"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <view class="com.example.LockButton$ProgressCircle"
        android:layout_width="68dp"
        android:layout_height="68dp"
        android:layout_gravity="center"
        />

    <ImageButton
        android:id="@+id/lock_button_actual"
        android:layout_width="@dimen/fab_size"
        android:layout_height="@dimen/fab_size"
        android:background="@drawable/button_lock_background"
        android:src="@drawable/icon_lock_status"
        android:tint="@color/white"
        android:elevation="6dp"
        android:layout_gravity="center"
        android:duplicateParentState="true"
        />
</FrameLayout>

属性XML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="lockState">
        <attr name="state_locked" format="boolean" />
    </declare-styleable>
</resources>

Drawable icon_lock_status.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item app:state_locked="false" android:drawable="@drawable/icon_lock_open" />
    <item app:state_locked="true" android:drawable="@drawable/icon_lock_closed"/>
</selector>

Drawable button_lock_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight"
    >
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/button_lock_color" />
        </shape>
    </item>
</ripple>

颜色button_lock_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item app:state_locked="false" android:color="@color/grey_dark" />
    <item app:state_locked="true" android:color="@color/vibrant_red" />
</selector>

当我需要更改状态时,我只需调用

lockButton.lock(true); // or false
LockButton上的

我还测试了是否使用默认状态而不是我的自定义状态会更好。这没有用。 ImageButton仍然不响应默认状态的更改。

将StateListDrawable设置为LockButton(FrameLayout)的背景可以正常工作。所以状态变化对父母来说是正常的,它只是没有反映在孩子身上。

0 个答案:

没有答案