??????. TextView?????????????????????

?????????Android??ó??????(Keyboard)????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????潨????????????е??

??????????????????????????????????????????????????????????????????????????????????????????????ó???????????????????????????????????????????????????????????????????????ViewRoot???????????deliverKeyEvent????deliverPointerEvent????????????????????????????????????У?ViewRoot?????????deliverKeyEvent?????????????????????ViewRoot?????????deliverPointerEvent?????????????????????

?????????????????ViewRoot?????????deliverKeyEvent????????????TextView?????ü???????????(???????????????????????)?????2?????

?????2 TextView?????ü???????????

????????????????14?????裬????????????????????????衣

????Step 1. ViewRoot.deliverKeyEvent

????[java] view plaincopyprint?

????public final class ViewRoot extends Handler implements ViewParent??

????View.AttachInfo.Callbacks {

????......

????private void deliverKeyEvent(KeyEvent event?? boolean sendDone) {

????// If mView is null?? we just consume the key event because it doesn't

????// make sense to do anything else with it.

????boolean handled = mView != null

????? mView.dispatchKeyEventPreIme(event) : true;

????if (handled) {

????if (sendDone) {

????finishInputEvent();

????}

????return;

????}

????// If it is possible for this window to interact with the input

????// method window?? then we want to first dispatch our key events

????// to the input method.

????if (mLastWasImTarget) {

????InputMethodManager imm = InputMethodManager.peekInstance();

????if (imm != null && mView != null) {

????int seq = enqueuePendingEvent(event?? sendDone);

????......

????imm.dispatchKeyEvent(mView.getContext()?? seq?? event??

????mInputMethodCallback);

????return;

????}

????}

????deliverKeyEventToViewHierarchy(event?? sendDone);

????}

????......

????}

????public final class ViewRoot extends Handler implements ViewParent??

????View.AttachInfo.Callbacks {

????......

????private void deliverKeyEvent(KeyEvent event?? boolean sendDone) {

????// If mView is null?? we just consume the key event because it doesn't

????// make sense to do anything else with it.

????boolean handled = mView != null

????? mView.dispatchKeyEventPreIme(event) : true;

????if (handled) {

????if (sendDone) {

????finishInputEvent();

????}

????return;

????}

????// If it is possible for this window to interact with the input

????// method window?? then we want to first dispatch our key events

????// to the input method.

????if (mLastWasImTarget) {

????InputMethodManager imm = InputMethodManager.peekInstance();

????if (imm != null && mView != null) {

????int seq = enqueuePendingEvent(event?? sendDone);

????......

????imm.dispatchKeyEvent(mView.getContext()?? seq?? event??

????mInputMethodCallback);

????return;

????}

????}

????deliverKeyEventToViewHierarchy(event?? sendDone);

????}

????......

????}

????????????????????frameworks/base/core/java/android/view/ViewRoot.java?С?