按类型(类)查找具有Activity实例的视图

时间:2011-04-05 15:08:06

标签: java android

package net.example.view;
class StatusBar extends View { ... }

我在布局中使用它如下:

<net.example.view.StatusBar .../>

我必须通过它的类型(类)找到它,我的意思是:

myActivityInstance.findViewsByClass(StatusBar.class) // returns View[]

有可能吗?如果没有,在不使用findViewById()的情况下找到元素的更好方法是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

如果你不能使用id而你的内容视图是某种ViewGroup,你可以迭代孩子们。

ViewGroup vg = (ViewGroup) activity.getContentView();
for(int i=0; i<vg.getChildCount(); i++) {
    View v = vg.getChildAt(i);
    if(v instanceof StatusBar) {
        // do something interesting.
    }
}

此外,如果您知道具体索引,则可以直接致电getChildAt(index)

答案 1 :(得分:0)

我不认为activity有一个方法会根据类类型返回一个Views数组。如果你想在不使用findViewById()的情况下获取它们的数组,你可以动态地创建它们并将它们添加到你的布局中:

    mLayout = (LinearLayout)findViewById(R.id.mLayout);
    StatusBar[] mBars = new StatusBar[10];
    for(int i = 0; i < mViews.length; i++){
        mBars[i] = new StatusBar(yourActivity.this);
        mLayout.addView(mBars[i]);
    }

这将为您提供一个充满StatusBar对象的数组,这些对象已添加到您的布局中。 (如果你想也可以制作View类型的数组。)

如果您想要在XML中定义所有视图,我认为有一种方法可以避免在类似于此的循环中使用findViewById()来获取一个充满对所有这些视图的引用的数组。对于这种方法,您可能必须创建一个与包含视图的所有resID相同大小的整数数组

ids[0] = R.id.mStatusBar1;
ids[1] = R.id.mStatusBar2;