循环浏览Android视图的所有子视图?
我正在为Android开发一款游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后,我将插入这个类的几个实例作为主视图的子对象。每个实例都将在按下时处理检测(通过OnTouchListener) 我现在遇到的问题是如何循环所有这些子视图,以便读取它们的状态并处理它们?(也就是说,当他们都达到某个特定的状态时,就会发生一些事情)循环浏览Android视图的所有子视图?,android,view,viewgroup,android-viewgroup,Android,View,Viewgroup,Android Viewgroup,我正在为Android开发一款游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后,我将插入这个类的几个实例作为主视图的子对象。每个实例都将在按下时处理检测(通过OnTouchListener) 我现在遇到的问题是如何循环所有这些子视图,以便读取它们的状态并处理它们?(也就是说,当他们都达到某个特定的状态时,就会发生一些事情) 或者,有没有更好的方法让屏幕上的多个对象对触摸做出响应,我可以检查它们的状态?使用视图听起来,如果有移动,渲染任何东西都会非常困难。您可能希望在画布上绘制,或者使用O
或者,有没有更好的方法让屏幕上的多个对象对触摸做出响应,我可以检查它们的状态?使用
视图
听起来,如果有移动,渲染任何东西都会非常困难。您可能希望在画布上绘制,或者使用OpenGL
,除非您正在做一些真正静态的工作。这是去年关于制作Android游戏的I/O会议的一篇文章。它有点长,你可以跳过大约15分钟。此外,该来源是可用的。这应该会让你对处理事情的方法有一个很好的想法@jqpubliq是正确的,但是如果你真的想浏览所有视图,你只需使用ViewGroup
中的getChildCount()
和getChildAt()
方法即可。一个简单的递归方法将完成剩下的工作。我举了一个递归函数的小例子:
public void recursiveLoopChildren(ViewGroup parent) {
for (int i = 0; i < parent.getChildCount(); i++) {
final View child = parent.getChildAt(i);
if (child instanceof ViewGroup) {
recursiveLoopChildren((ViewGroup) child);
// DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED
} else {
if (child != null) {
// DO SOMETHING WITH VIEW
}
}
}
}
public void recursiveLoopChildren(视图组父级){
对于(int i=0;i
该函数将开始在视图组中的所有视图元素上循环(从第一项到最后一项),如果子视图组是视图组
,则使用该子视图重新启动该函数以检索该子视图中的所有嵌套视图。
public static void recursivelyFindChildren(View view) {
if (view instanceof ViewGroup) {
//ViewGroup
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
recursivelyFindChildren(viewGroup.getChildAt(i));
}
} else {
//View
}
}
publicstaticvoid递归查找子对象(视图){
if(视图组的视图实例){
//视图组
ViewGroup ViewGroup=(ViewGroup)视图;
对于(int i=0;i
或者,您可以返回您可以使用下一种方法的内容
@Nullable
private static WebView recursivelyFindWebView(View view) {
if (view instanceof ViewGroup) {
//ViewGroup
ViewGroup viewGroup = (ViewGroup)view;
if (!(viewGroup instanceof WebView)) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
WebView result = recursivelyFindWebView(viewGroup.getChildAt(i));
if (result != null) {
return result;
}
}
} else {
//WebView
WebView webView = (WebView)viewGroup;
return webView;
}
}
return null;
}
@Nullable
私有静态WebView递归查找WebView(视图){
if(视图组的视图实例){
//视图组
ViewGroup ViewGroup=(ViewGroup)视图;
如果(!(WebView的视图组实例)){
对于(int i=0;i
试试这个。获取父布局中的所有视图并返回视图的数组列表
public List<View> getAllViews(ViewGroup layout){
List<View> views = new ArrayList<>();
for(int i =0; i< layout.getChildCount(); i++){
views.add(layout.getChildAt(i));
}
return views;
}
公共列表GetAllView(视图组布局){
列表视图=新建ArrayList();
对于(int i=0;i
是的,我让你需要用不同的方式来做,但我要先试试这个。这是一个随意的游戏。你为什么选择作为(int i=parent.getChildCount()-1;i>=0;i--)而不是作为(int i=0;i
?@PeterProkop我个人更喜欢这个循环。在循环过程中,即使您删除了循环的一个元素,它也能正常工作。@Karacago WebView是一个视图组,因此您可以在if(ViewGroup的子实例)之前添加if(WebView的子实例)
条件。