First of all, this is not a duplicate question of this: How to override Android keyboard
My problem is a little bit different from the above one.
I'm playing music in the background in my app and I want to play/pause it if a user press to Enter
or Space
keys on any fragment or activity(I have only 1 activity) with a Chromebook's keyboard
. I already implemented this and it works just fine. But there's a catch: When the user is focused on a button (ex: open X fragment), the Space
or Enter
key is firing the button's click event. So I want to override this.
Here's what I've tried:
Main Activity
public class MainActivity extends AppCompatActivity {
....
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_ENTER) {
BackingTrackFragment.newInstance().onKeyUp(keyCode, event);
return true;
}
return super.onKeyUp(keyCode, event);
}
}
My Fragment
public class SomeFragment extends BaseFragment implements KeyboardKeyEventListener {
...
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// play/pause the song
return true;
}
}
Interface
public interface KeyboardKeyEventListener {
boolean onKeyUp(int keyCode, KeyEvent event);
}
Overloading dispatchKeyEvent
fixed the problem. It will prevent any and all the key events.
Main Activity
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_SPACE) {
if (event.getAction() == KeyEvent.ACTION_UP) {
SomeFragment.newInstance().dispatchKeyEvent(event);
return false;
}
}
return super.dispatchKeyEvent(event);
}
My Fragment
public class SomeFragment extends BaseFragment implements KeyboardKeyEventListener {
...
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// play/pause the song
return true;
}
}
The Interface for Overloading
public interface KeyboardKeyEventListener {
boolean dispatchKeyEvent(KeyEvent event);
}