要按id查找所有视图,可以使用以下解决方法:
public List findViewsById(View root, int id) {
List result = new ArrayList<>();
if (root.getId() == id) {
result.add(root);
}
if (root instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) root;
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = viewGroup.getChildAt(i);
result.addAll(findViewsById(child, id));
}
}
return result;
}
使用示例:
List views = findViewsById(rootView, R.id.myViewId);
public class ViewFinder {
private List views;
private int targetId;
public List findViewsById(View root, int id) {
views = new ArrayList<>();
targetId = id;
ViewTreeObserver observer = root.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
findViews(root);
root.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
return views;
}
private void findViews(View root) {
if (root.getId() == targetId) {
views.add(root);
}
if (root instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) root;
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = viewGroup.getChildAt(i);
findViews(child);
}
}
}
}
使用示例:
ViewFinder viewFinder = new ViewFinder();
List views = viewFinder.findViewsById(rootView, R.id.myViewId);
这些方法可以遍历整个视图层级,找到所有匹配id的视图,并将它们存储在一个列表中。
上一篇:按id查询特定的播放列表
下一篇:按ID查找TFS构建请求