How to modify the default button state in Android without affecting the pressed and selected states?

前端 未结 2 1221
北恋
北恋 2020-12-21 10:54

I am trying to remove an ImageButton\'s background in only the default state. I\'d like the pressed and selected states to behave as usual so that they look correct on diffe

相关标签:
2条回答
  • 2020-12-21 11:42
    StateListDrawable replace = new StateListDrawable();
    
    Drawable old = getBackground();
    replace.addState(FOCUSED_STATE_SET, old);
    replace.addState(SELECTED_STATE_SET, old);
    replace.addState(PRESSED_STATE_SET, old);
    
    replace.addState(StateSet.WILD_CARD, new ColorDrawable(Color.TRANSPARENT));
    
    if (Build.VERSION.SDK_INT >= 16) {
        setBackground(replace);
    } else {
        setBackgroundDrawable(replace);
    }
    
    0 讨论(0)
  • 2020-12-21 11:45

    Tom,

    It's true that if you override the default state you also have to override the pressed and focused states. The reason is that the default android drawable is a selector, and so overriding it with a static drawable means that you lose the state information for pressed and focused states as you only have one drawable specified for it. It's super easy to implement a custom selector, though. Do something like this:

    <selector
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/custombutton">
    
        <item
            android:state_focused="true"
            android:drawable="@drawable/focused_button" />
        <item
            android:state_pressed="true"
            android:drawable="@drawable/pressed_button" />
        <item
            android:state_pressed="false"
            android:state_focused="false"
            android:drawable="@drawable/normal_button" />
    </selector>
    

    Put this in your drawables directory, and load it like a normal drawable for the background of the ImageButton. The hardest part for me is designing the actual images.

    Edit:

    Just did some digging into the source of EditText, and this is how they set the background drawable:

    public EditText(/*Context context, AttributeSet attrs, int defStyle*/) {
        super(/*context, attrs, defStyle*/);
    
                StateListDrawable mStateContainer = new StateListDrawable();
    
                ShapeDrawable pressedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
                pressedDrawable.getPaint().setStyle(Paint.FILL);
                pressedDrawable.getPaint().setColor(0xEDEFF1);
    
    
                ShapeDrawable focusedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
                focusedDrawable.getPaint().setStyle(Paint.FILL);
                focusedDrawable.getPaint().setColor(0x5A8AC1);
    
                ShapeDrawable defaultDrawable = new ShapeDrawable(new RoundRectShape(10,10));
                defaultDrawable.getPaint().setStyle(Paint.FILL);
                defaultDrawable.getPaint().setColor(Color.GRAY);
    
    
    
                mStateContainer.addState(View.PRESSED_STATE_SET, pressedDrawable);
                mStateContainer.addState(View.FOCUSED_STATE_SET, focusedDrawable);
                mStateContainer.addState(StateSet.WILD_CARD, defaultDrawable);
    
                this.setBackgroundDrawable(mStateContainer);
    }
    

    I'm sure you could adapt the idea to your purposes. Here is the page I found it on:

    http://www.google.com/codesearch/p?hl=en#ML2Ie1A679g/src/android/widget/EditText.java

    0 讨论(0)
提交回复
热议问题