如何在根布局中一般检索某种类型的所有孩子?

问题描述:

我的意思是我的问题(如果我不明确地说,因为我找不到我的问题的答案)是采取根布局,获得该布局的所有孩子,并对任何是这样的布局执行回调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); 
    } 

差的线是我的依靠回调和诸如此类的东西,但总体上同一个概念。

+0

请参见'Class#isInstance(Object object)' – pskink

尝试以下代码:

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

+0

使用'Class#isInstance'而不是'Class#equals',所以要匹配任何'View'你可以简单地使用'View.class ' – pskink

+0

与我的解决方案非常相似,并且我之前见过它我已经完成了你的解决方案。 –

没有通用的方法。如果有人这样做,只会做类似的事情。在的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; 

See documentation

+0

等等那些孩子在View []数组中保存了什么? – pskink

+0

简单地说,android没有检索所有视图的实现。你必须实现你自己的方法遍历视图层次结构中的递归和使条件语句比较每个视图 – subhash