[안드로이드-API] Layout Traversal
Example.java
/* basic usage */
ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
LayoutTraverser.build(new LayoutTraverser.Processor() {
@Override
public void process(View view) {
// do stuff with the view
}
}).traverse(root);
/* traverse multiple hierarchies using the same processing logic */
LayoutTraverser traverser = LayoutTraverser.build(new LayoutTraverser.Processor() {
@Override
public void process(View view) {
// do stuff with the view
}
});
traverser.traverse(root);
traverser.traverse(root2);
traverser.traverse(root3);
/* two static methods: finding views by tag and finding views of a specific type */
// all views tagged "coolView" under "root"
List<View> coolViews = Views.find(root, "coolView");
// all ImageView views under "root"
List<ImageView> imageViews = Views.find(root, ImageView.class);
Views.java
package com.androidwtf.android;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
final public class Views {
private Views() {}
public static List<View> find(ViewGroup root, Object tag) {
FinderByTag finderByTag = new FinderByTag(tag);
LayoutTraverser.build(finderByTag).traverse(root);
return finderByTag.getViews();
}
public static <T extends View> List<T> find(ViewGroup root, Class<T> type) {
FinderByType<T> finderByType = new FinderByType<T>(type);
LayoutTraverser.build(finderByType).traverse(root);
return finderByType.getViews();
}
private static class FinderByTag implements LayoutTraverser.Processor {
private final Object searchTag;
private final List<View> views = new ArrayList<View>();
private FinderByTag(Object searchTag) {
this.searchTag = searchTag;
}
@Override
public void process(View view) {
Object viewTag = view.getTag();
if (viewTag != null && viewTag.equals(searchTag)) {
views.add(view);
}
}
private List<View> getViews() {
return views;
}
}
private static class FinderByType<T extends View> implements LayoutTraverser.Processor {
private final Class<T> type;
private final List<T> views;
private FinderByType(Class<T> type) {
this.type = type;
views = new ArrayList<T>();
}
@Override
@SuppressWarnings("unchecked")
public void process(View view) {
if (type.isInstance(view)) {
views.add((T) view);
}
}
public List<T> getViews() {
return views;
}
}
}
출처 : https://gist.github.com/gelitenight/7999448
'나는 프로그래머다! > Java & Android' 카테고리의 다른 글
안드로이드 개발 재개 from 2020 #2 구글플레이 등록 (0) | 2021.01.23 |
---|---|
안드로이드 개발 재개 from 2020 #1 (0) | 2021.01.18 |
Java 프로그램 jar를 exe로 만들기 (0) | 2019.10.01 |
안드로이드 기본개념 면접대비 정리 (0) | 2019.07.15 |
[Java] String, StringBuffer, StringBuilder 차이 (0) | 2016.06.17 |
[Java] Collection Framework 간단 정리 (0) | 2016.06.17 |
안드로이드 리소스 정책 #4 - 관리 및 방법 편 (0) | 2016.04.28 |
안드로이드 리소스 정책 #3 (0) | 2016.04.22 |
안드로이드 리소스 정책 #2 (0) | 2016.04.19 |
안드로이드 리소스 정책 #1 (0) | 2016.04.19 |