User Button with User State

I created my own button class (I followed this topic: http://developer.android.com/training/custom-views/create-view.html )

Now I would like to create a user state (state_avaibility), I created a new attribute attrs.xml:

<declare-styleable name="CustomButton">
    <attr name="state_available" format="boolean" />
</declare-styleable>

I wanted to use

 StateListDrawable mNormalDrawable;
 mNormalDrawable = new StateListDrawable();
 mNormalDrawable.addState(new int[]{R.attr.state_available}, createAvailableDrawable(attr));

But this method does not accept user state.

Do you know how I can create a custom button (create programmatically) and add a custom state?

EDIT:

I created two buttons (accessible and inaccessible), I have two ways to do this:

private LayerDrawable createAvailableDrawable(TypedArray attr) {
LayerDrawable drawableAvailable = (LayerDrawable) getDrawable(R.drawable.button_available).mutate();

// Some modifications with custom attributs
   return drawableAvailable;
}

private LayerDrawable createUnavailableDrawable(TypedArray attr) {
LayerDrawable drawableUnavailable = (LayerDrawable) getDrawable(R.drawable.button_unavailable).mutate();

// Some modifications with custom attributes 
   return drawableUnavailable;
}

After I got a new custom attribute:

<declare-styleable name="CustomButton">
    <attr name="state_available" format="boolean" />
</declare-styleable>

Then I tried the onCreateDrawableState method:

@Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);

        if (mIsAvailable) {
            mergeDrawableStates(drawableState, STATE_AVAILABLE);
        }

        return drawableState;
    } 

Then I tried this:

 StateListDrawable mNormalDrawable;
 mNormalDrawable = new StateListDrawable();
 mNormalDrawable.addState(new int[]{R.attr.state_available}, createAvailableDrawable(attr));
mNormalDrawable.addState(new int[]{-R.attr.state_available}, createUnavailableDrawable(attr));

Now I add a button:

<mobile.custom.com.library.Widget.CustomButton
        android:id="@+id/CustomButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        custom:vd_cornerRadius="5dp"
        custom:vd_color_text_unavailable="@color/yellow"
        custom:vd_text_available="@string/available"
        custom:vd_text_unavailable="@string/unavailable"
        custom:state_available="false" />

, custom: state_available,

+4
1

CustomButton onCreateDrawableState, :

private static final int[] STATE_AVAILABLE = { R.attr.state_available };

@Override
public int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
    if (available) {
        mergeDrawableStates(drawableState, STATE_AVAILABLE);
    }
    return drawableState;
}

mergeDrawableStates , STATE_AVAILABLE

0

All Articles