diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index b85670c233d61..bccde8d2cf9fd 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -4810,7 +4810,10 @@ public abstract class AbsListView extends AdapterView implements Te if (mFiltered && mPopup != null && mPopup.isShowing()) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - getKeyDispatcherState().startTracking(event, this); + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } handled = true; } else if (event.getAction() == KeyEvent.ACTION_UP && event.isTracking() && !event.isCanceled()) { diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index ee037cdc3ed83..4d8d21f4a3e02 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -607,10 +607,16 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe // special case for the back key, we do not even try to send it // to the drop down list but instead, consume it immediately if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - getKeyDispatcherState().startTracking(event, this); + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { - getKeyDispatcherState().handleUpEvent(event); + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.handleUpEvent(event); + } if (event.isTracking() && !event.isCanceled()) { dismissDropDown(); return true; diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 3bba816b8bff7..444a163d385db 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -915,10 +915,16 @@ public class ListPopupWindow { // to the drop down list but instead, consume it immediately final View anchorView = mDropDownAnchorView; if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - anchorView.getKeyDispatcherState().startTracking(event, this); + KeyEvent.DispatcherState state = anchorView.getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { - anchorView.getKeyDispatcherState().handleUpEvent(event); + KeyEvent.DispatcherState state = anchorView.getKeyDispatcherState(); + if (state != null) { + state.handleUpEvent(event); + } if (event.isTracking() && !event.isCanceled()) { dismiss(); return true; diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 5a5b6f49f5321..79d6a81d24616 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -1468,12 +1468,17 @@ public class PopupWindow { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - getKeyDispatcherState().startTracking(event, this); - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP - && getKeyDispatcherState().isTracking(event) && !event.isCanceled()) { - dismiss(); + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } return true; + } else if (event.getAction() == KeyEvent.ACTION_UP) { + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null && state.isTracking(event) && !event.isCanceled()) { + dismiss(); + return true; + } } return super.dispatchKeyEvent(event); } else {