gpt4 book ai didi

java - 如何一般检索根布局中某种类型的所有子级?

转载 作者:行者123 更新时间:2023-12-02 04:20:07 25 4
gpt4 key购买 nike

我的问题的意思(如果我含糊其辞,因为我找不到问题的答案)是采用根布局,获取该布局的所有子布局,并对任何子布局执行回调指定类型的实例。

现在,我可以通过固定的方式轻松做到这一点,例如......

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并传入根布局和目标类。您应该收到作为目标类实例的所有 View 的列表。如果根布局也是目标类的实例,则这将包括根布局本身。该方法将搜索根布局的整个 View 树。

关于java - 如何一般检索根布局中某种类型的所有子级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com