code: public boolean executeKeyEvent(KeyEvent event) {
          boolean handled = false;
          if (event.getAction() == KeyEvent.ACTION_DOWN) {
              switch (event.getKeyCode()) {
                  case KeyEvent.KEYCODE_DPAD_LEFT:
                      handled = arrowScroll(FOCUS_LEFT);
                      break;
                  case KeyEvent.KEYCODE_DPAD_RIGHT:
                      handled = arrowScroll(FOCUS_RIGHT);
                      break;
                  case KeyEvent.KEYCODE_TAB:
                      if (Build.VERSION.SDK_INT >= 11) {
                          // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
                          // before Android 3.0. Ignore the tab key on those devices.
                          if (KeyEventCompat.hasNoModifiers(event)) {
                              handled = arrowScroll(FOCUS_FORWARD);
                          } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
                              handled = arrowScroll(FOCUS_BACKWARD);
                          }
                      }
                      break;
              }
          }
          return handled;
      }
docs: You can call this function yourself to have the scroll view perform
  scrolling from a key event, just as if the event had been dispatched to
  it by the view hierarchy.
  
  @param event The key event to execute.
  @return Return true if the event was handled, else false.