如何在根布局中一般检索某种类型的所有孩子?
我的意思是我的问题(如果我不明确地说,因为我找不到我的问题的答案)是采取根布局,获得该布局的所有孩子,并对任何是这样的布局执行回调instanceof指定的类型。现在如何在根布局中一般检索某种类型的所有孩子?
,我可以做一个固定的方式,很容易通过做类似...
RelativeLayout root = (RelativeLayout) findViewById(R.id.root_layout);
for(int i = 0; i <= root.getChildCount(); i++){
View v = root.getChildAt(i);
if(v instanceof CustomLayout){
// Do Callback on view.
}
}
事情是,我想让它更通用。我应该可以使用任何布局,并检查它是否是任何布局的实例。特别是,我希望它足够通用,可以与任何东西一起使用(如果这甚至可能)。当然,我并不介意只停留在布局上。
我想建立这些孩子的集合,并返回它们,如果可能的话是相同的类型。我很久没有做Java了,所以我非常生疏,但我正在考虑用反射来实现这一点。这是可能吗?
如果我通过我想要的类型的类,是否有可能?
编辑:
我没有看到过dtann的答案,一定是错过了,但我做到了我自己,它看起来非常像他。我去实现的东西沿着这
public static abstract class CallbackOnRootChildren<T> {
@SuppressWarnings("unchecked")
public void callOnChildren(Class<T> clazz, ViewGroup root) {
for(int i = 0; i < root.getChildCount(); i++){
View v = root.getChildAt(i);
if(v instanceof ViewGroup){
callOnChildren(clazz, (ViewGroup) v);
}
if(clazz.isAssignableFrom(v.getClass())){
// The check to see if it is assignable ensures it's type safe.
onChild((T) v);
}
}
}
public abstract void onChild(T child);
}
差的线是我的依靠回调和诸如此类的东西,但总体上同一个概念。
尝试以下代码:
public <T> List<T> getViewsByClass(View rootView, Class<T> targetClass) {
List<T> items = new ArrayList<>();
getViewsByClassRecursive(items,rootView,targetClass);
return items;
}
private void getViewsByClassRecursive(List items, View view, Class clazz) {
if (view.getClass().equals(clazz)) {
Log.d("TAG","Found " + view.getClass().getSimpleName());
items.add(view);
}
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup)view;
if (viewGroup.getChildCount() > 0) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
getViewsByClassRecursive(items, viewGroup.getChildAt(i), clazz);
}
}
}
}
呼叫getViewsByClass
并通过在根布局和目标类。您应该收到所有作为目标类实例的视图的列表。这将包括根布局本身,如果它也是目标类的实例。此方法将搜索根布局的整个视图树。
使用'Class#isInstance'而不是'Class#equals',所以要匹配任何'View'你可以简单地使用'View.class ' – pskink
与我的解决方案非常相似,并且我之前见过它我已经完成了你的解决方案。 –
没有通用的方法。如果有人这样做,只会做类似的事情。在的ViewGroup
视图被保持在字段等(源代码):
// Child views of this ViewGroup
private View[] mChildren;
// Number of valid children in the mChildren array, the rest should be null or not
// considered as children
private int mChildrenCount;
请参见'Class#isInstance(Object object)' – pskink