Extend NonLockingScrollView to support adding/removing views
Fixes #1908
This commit is contained in:
parent
d344a6898d
commit
c7c0ad0b7b
1 changed files with 35 additions and 18 deletions
|
@ -100,25 +100,14 @@ public class NonLockingScrollView extends ScrollView {
|
|||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
excludeChildrenFromInterceptions(this);
|
||||
setupDelegationOfTouchAndHierarchyChangeEvents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverses the view tree for {@link WebView}s so they can be excluded from touch
|
||||
* interceptions and receive all events.
|
||||
*/
|
||||
private void excludeChildrenFromInterceptions(View node) {
|
||||
// If additional types of children should be excluded (e.g. horizontal scrolling banners),
|
||||
// this needs to be modified accordingly.
|
||||
if (node instanceof WebView) {
|
||||
mChildrenNeedingAllTouches.add(node);
|
||||
} else if (node instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) node;
|
||||
final int childCount = viewGroup.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
final View child = viewGroup.getChildAt(i);
|
||||
excludeChildrenFromInterceptions(child);
|
||||
}
|
||||
|
||||
private void setupDelegationOfTouchAndHierarchyChangeEvents() {
|
||||
OnHierarchyChangeListener listener = new HierarchyTreeChangeListener();
|
||||
setOnHierarchyChangeListener(listener);
|
||||
for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
|
||||
listener.onChildViewAdded(this, getChildAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,4 +156,32 @@ public class NonLockingScrollView extends ScrollView {
|
|||
super.requestChildFocus(child, focused);
|
||||
}
|
||||
}
|
||||
|
||||
class HierarchyTreeChangeListener implements OnHierarchyChangeListener {
|
||||
@Override
|
||||
public void onChildViewAdded(View parent, View child) {
|
||||
if (child instanceof WebView) {
|
||||
mChildrenNeedingAllTouches.add(child);
|
||||
} else if (child instanceof ViewGroup) {
|
||||
ViewGroup childGroup = (ViewGroup) child;
|
||||
childGroup.setOnHierarchyChangeListener(this);
|
||||
for (int i = 0, childCount = childGroup.getChildCount(); i < childCount; i++) {
|
||||
onChildViewAdded(childGroup, childGroup.getChildAt(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChildViewRemoved(View parent, View child) {
|
||||
if (child instanceof WebView) {
|
||||
mChildrenNeedingAllTouches.remove(child);
|
||||
} else if (child instanceof ViewGroup) {
|
||||
ViewGroup childGroup = (ViewGroup) child;
|
||||
for (int i = 0, childCount = childGroup.getChildCount(); i < childCount; i++) {
|
||||
onChildViewRemoved(childGroup, childGroup.getChildAt(i));
|
||||
}
|
||||
childGroup.setOnHierarchyChangeListener(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue