code: public boolean executeKeyEvent(KeyEvent event) {
  		mTempRect.setEmpty();
  
  		if (!canScroll()) {
  			if (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
  				View currentFocused = findFocus();
  				if (currentFocused == this) currentFocused = null;
  				View nextFocused = FocusFinder.getInstance().findNextFocus(this,
  						currentFocused, View.FOCUS_DOWN);
  				return nextFocused != null
  						&& nextFocused != this
  						&& nextFocused.requestFocus(View.FOCUS_DOWN);
  			}
  			return false;
  		}
  
  		boolean handled = false;
  		if (event.getAction() == KeyEvent.ACTION_DOWN) {
  			switch (event.getKeyCode()) {
  				case KeyEvent.KEYCODE_DPAD_UP:
  					if (!event.isAltPressed()) {
  						handled = arrowScroll(View.FOCUS_UP);
  					} else {
  						handled = fullScroll(View.FOCUS_UP);
  					}
  					break;
  				case KeyEvent.KEYCODE_DPAD_DOWN:
  					if (!event.isAltPressed()) {
  						handled = arrowScroll(View.FOCUS_DOWN);
  					} else {
  						handled = fullScroll(View.FOCUS_DOWN);
  					}
  					break;
  				case KeyEvent.KEYCODE_SPACE:
  					pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
  					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.