diff options
| author | Alan Viverette <alanv@google.com> | 2013-10-30 11:09:03 -0700 |
|---|---|---|
| committer | Alan Viverette <alanv@google.com> | 2013-10-30 11:09:03 -0700 |
| commit | 5d565faab21324862fa24490f116424e1b668b1d (patch) | |
| tree | 3870f0aab8a63ff28b38c749f18349a970158e51 /core/java/android/widget/GridView.java | |
| parent | 0160bcbe531eebe882999f041348ce0182fc5bab (diff) | |
Restore A11y and keyboard focus positions after GridView layout
Implementation copied verbatim from ListView. Moved a common helper
method into AbsListView.
BUG: 11438088
Change-Id: Iae44a8f3743669f63a67fd20f22dfc0486a1d063
Diffstat (limited to 'core/java/android/widget/GridView.java')
| -rw-r--r-- | core/java/android/widget/GridView.java | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index 696c3c4481f0..4f741083525d 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -23,6 +23,7 @@ import android.content.res.TypedArray; import android.graphics.Rect; import android.os.Trace; import android.util.AttributeSet; +import android.util.MathUtils; import android.view.Gravity; import android.view.KeyEvent; import android.view.SoundEffectConstants; @@ -1215,6 +1216,24 @@ public class GridView extends AbsListView { setSelectedPositionInt(mNextSelectedPosition); + // Remember which child, if any, had accessibility focus. + final int accessibilityFocusPosition; + final View accessFocusedChild = getAccessibilityFocusedChild(); + if (accessFocusedChild != null) { + accessibilityFocusPosition = getPositionForView(accessFocusedChild); + accessFocusedChild.setHasTransientState(true); + } else { + accessibilityFocusPosition = INVALID_POSITION; + } + + // Ensure the child containing focus, if any, has transient state. + // If the list data hasn't changed, or if the adapter has stable + // IDs, this will maintain focus. + final View focusedChild = getFocusedChild(); + if (focusedChild != null) { + focusedChild.setHasTransientState(true); + } + // Pull all children into the RecycleBin. // These views will be reused if possible final int firstPosition = mFirstPosition; @@ -1229,7 +1248,6 @@ public class GridView extends AbsListView { } // Clear out old views - //removeAllViewsInLayout(); detachAllViewsFromParent(); recycleBin.removeSkippedScrap(); @@ -1300,6 +1318,27 @@ public class GridView extends AbsListView { mSelectorRect.setEmpty(); } + if (accessFocusedChild != null) { + accessFocusedChild.setHasTransientState(false); + + // If we failed to maintain accessibility focus on the previous + // view, attempt to restore it to the previous position. + if (!accessFocusedChild.isAccessibilityFocused() + && accessibilityFocusPosition != INVALID_POSITION) { + // Bound the position within the visible children. + final int position = MathUtils.constrain( + accessibilityFocusPosition - mFirstPosition, 0, getChildCount() - 1); + final View restoreView = getChildAt(position); + if (restoreView != null) { + restoreView.requestAccessibilityFocus(); + } + } + } + + if (focusedChild != null) { + focusedChild.setHasTransientState(false); + } + mLayoutMode = LAYOUT_NORMAL; mDataChanged = false; if (mPositionScrollAfterLayout != null) { |
