0

我在这里有一个非常烦人的问题,因为我仍在努力内化我正在做的每一件事,

我目前有一个 LinearLayout,然后在 Activity 的 onCreate 上,我将使用按钮填充或膨胀其他几个 LinearLayout,我的问题是,当我尝试访问按钮时,似乎我没有得到任何接近或更深LinearLayout,我能得到的只是 LinearLayout(Parent) 和另一个 LinearLayout(Children),我相信有一种方法,我只是完全困惑如何去做。

LinearLayout
 ->LinearLayout(Child1)->Button1, Button2, Button3
 ->LinearLayout(Child2)->Button4, Button5, Button6

我如何能够访问和获取按钮?

我的来源;

for (int x=0; x<ll.getChildCount(); x++){
  View v = ll.getChildAt(x);
  Class c = v.getClass();
  if(c == LinearLayout.class){
    for(int y=0; y< ; y++){
      **I know there is something that must be done here, likewise, is this the most
      efficient way of doing things?
    }
  }
 Log.i("test", c.getName());
}

XML 中只有 LinearLayout(Parent) 存在,其他的都是膨胀的运行时。

4

1 回答 1

0

您应该能够简单地v转换为 a LinearLayout,然后像访问其父级一样访问其子级。就像是:

for (int x=0; x<ll.getChildCount(); x++){
  View v = ll.getChildAt(x);
  Class c = v.getClass();
  if(c == LinearLayout.class){
    //Cast to LinearLayout since View doesn't expose a way to access children
    LinearLayout innerLayout = (LinearLayout)v;
    for(int y=0; y<innerLayout.getChildCount() ; y++){
      Button b = (Button)innerLayout.getChildAt(y);

      //Do something with b
    }
  }
 Log.i("test", c.getName());
}


根据您的确切层次结构,您可以通过删除反射并简单地进行空检查来简化此操作(如果需要,将其包装在 try/catch 中并捕获 a ClassCastException)。在需要遍历动态生成的布局树的情况下,我通常会这样做:

for (int i = 0; i < outerLayout.getChildCount(); ++i)
{
    try
    {
        LinearLayout innerLayout = (LinearLayout)outerLayout.getChildAt(i);

        if (innerLayout != null)
        {
            for (int j = 0; j < innerLayout.getChildCount(); ++j)
            {
                Button btn = (Button)innerLayout.getChildAt(j);

                //Do something with btn
            }
        }
    }
    catch (ClassCastException cEx)
    {
        Log.w("WARN", "Unexpected child type in outerLayout. " + cEx.getMessage());
    }
}

这是一个未经测试的示例(可能需要更好的异常处理,具体取决于您的要求和布局),但希望它能为您提供总体思路。如果您想更加与类型无关,也可以使用强制转换来ViewGroup代替。如果需要,这将允许您潜在地使用不同类型的布局容器作为子类,因为它们是子类ViewGroup(这是它们继承getChildAt()和继承的地方getChildCount())。

于 2012-05-11T18:20:49.067 回答