I replicated your code and got the custom button selector working but setting:
@Override
public boolean onTouch(View v, MotionEvent event) {
// Blah blah blah....
return false; // this was return true
}
});
According to the android docs, public boolean onTouch(),
Returns: True if the listener has consumed the event, false otherwise.
So returning true indicates your method has consumed the event and seems to stop it perculating up the hierarchy and triggering the selector states.