Android 返回组件ID的列表';是安卓系统中的一项活动?

Android 返回组件ID的列表';是安卓系统中的一项活动?,android,android-library,identifier,custom-component,Android,Android Library,Identifier,Custom Component,我正在整理一个小的android库,供其他开发者在他们的android应用程序中使用。第三方开发人员将在其xml视图中添加我的自定义按钮,例如“com.example.myLibrary.CustomButton”。 开发者可以根据需要设置任意数量的按钮 我的库代码是否有办法识别活动中有多少自定义按钮,然后返回它们的ID,这些ID可以是应用程序开发人员设置的任何内容? 我已经尝试了int[]I=getResources().getIdentifier(“名称”、“组件”、“包”)但它返回一个6位

我正在整理一个小的android库,供其他开发者在他们的android应用程序中使用。第三方开发人员将在其xml视图中添加我的自定义按钮,例如“com.example.myLibrary.CustomButton”。 开发者可以根据需要设置任意数量的按钮

我的库代码是否有办法识别活动中有多少自定义按钮,然后返回它们的ID,这些ID可以是应用程序开发人员设置的任何内容?

我已经尝试了
int[]I=getResources().getIdentifier(“名称”、“组件”、“包”)但它返回一个6位数的int,我假设它是组件的某个系统标识符,而不是它的每个实例

注意——我知道库需要通过
新MyLibrary(context)之类的方式来获取应用程序活动的上下文
传递应用程序活动的上下文。我已经在库的其他方面实现了这一点,这样就不会出现问题


在此之前,非常感谢您提出的任何有助于解决此问题的建议,Android中的ID是在运行时自动分配的整数,除非事先声明。id对于每个控件都是唯一的,但是
@+id/myIdName
片段只是用于在代码中引用(想想枚举)。这些资源ID可以通过以下方式按名称引用:

getResources().getResourceEntryName(int resid);
如果您需要一次获取所有资源ID,还可以使用两个其他选项

1) 将类包装到一个可以跟踪信息的管理器中

2) 迭代活动中的所有组件

//make an array list to hold the info
ArrayList<MyView> ids = new ArrayList<>();
//get the window to look through
ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView();
//call things recursively
findAllViews(viewGroup, ids);


private static void findAllViews(ViewGroup viewGroup,ArrayList<Integer> ids) {
    for (int i = 0, n = viewGroup.getChildCount(); i < n; i++) {
        View child = viewGroup.getChildAt(i);
        if (child instanceof ViewGroup) {
            findAllViews((ViewGroup) child, ids);
        } else if (child instanceof Button) {
            ids.add((Integer) child.getId());
        }
    }
}
//制作一个数组列表来保存信息
ArrayList ID=新的ArrayList();
//让窗户往里看
ViewGroup ViewGroup=(ViewGroup)getWindow().getDecorView();
//递归地调用事物
FindAllView(视图组,ID);
私有静态void findAllViews(视图组、视图组、ArrayList ID){
对于(int i=0,n=viewGroup.getChildCount();i
Android中的ID是在运行时自动分配的整数,除非事先声明。id对于每个控件都是唯一的,但是
@+id/myIdName
片段只是用于在代码中引用(想想枚举)。这些资源ID可以通过以下方式按名称引用:

getResources().getResourceEntryName(int resid);
如果您需要一次获取所有资源ID,还可以使用两个其他选项

1) 将类包装到一个可以跟踪信息的管理器中

2) 迭代活动中的所有组件

//make an array list to hold the info
ArrayList<MyView> ids = new ArrayList<>();
//get the window to look through
ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView();
//call things recursively
findAllViews(viewGroup, ids);


private static void findAllViews(ViewGroup viewGroup,ArrayList<Integer> ids) {
    for (int i = 0, n = viewGroup.getChildCount(); i < n; i++) {
        View child = viewGroup.getChildAt(i);
        if (child instanceof ViewGroup) {
            findAllViews((ViewGroup) child, ids);
        } else if (child instanceof Button) {
            ids.add((Integer) child.getId());
        }
    }
}
//制作一个数组列表来保存信息
ArrayList ID=新的ArrayList();
//让窗户往里看
ViewGroup ViewGroup=(ViewGroup)getWindow().getDecorView();
//递归地调用事物
FindAllView(视图组,ID);
私有静态void findAllViews(视图组、视图组、ArrayList ID){
对于(int i=0,n=viewGroup.getChildCount();i
Nick。非常感谢您澄清我收到的整数是ID的系统级整数,以及如何在视图组中获取组件-但是如果我不知道
整数ID
@+ID/idName
,如果您知道我的意思,这是否有效。开发人员将添加自定义组件x次,并向其添加任何ID名称。只是一个想法,但也许有更好的方法?也许库应该以编程方式将ID分配给自定义按钮的每个实例?干杯。我对你所做的事感到困惑,我得到了你的解决方案!我只需要将父活动上下文添加到
ViewGroup ViewGroup=(ViewGroup)activityContext.getWindow().getDecorView()中行,然后我能够为特定的UI组件生成ID整数的ArrayList。非常感谢!伟大的很高兴你被纠正了。我将编辑我的答案以反映这一点。如果您是从活动中调用此方法,而不是从片段中调用此方法,则始终可以使用
this
作为活动的关键字(如果您还不知道的话)。我不明白您关于以编程方式分配ID的第一个问题?我以前曾尝试以编程方式指定ID,API 17添加了一个
generateWiid()
方法,如果您要求的是唯一的ID,该方法将确保您得到唯一的ID。Nick。非常感谢您澄清我收到的整数是ID的系统级整数,以及如何在视图组中获取组件-但是如果我不知道
整数ID
@+ID/idName
,如果您知道我的意思,这是否有效。开发人员将添加自定义组件x次,并向其添加任何ID名称。只是一个想法,但也许有更好的方法?也许库应该以编程方式将ID分配给自定义按钮的每个实例?干杯。我对你所做的事感到困惑,我得到了你的解决方案!我只需要将父活动上下文添加到
ViewGroup ViewGroup=(ViewGroup)activityContext.getWindow().getDecorView()中行,然后我能够为特定的UI组件生成ID整数的ArrayList。非常感谢!伟大的很高兴你被纠正了。我将编辑我的答案以反映这一点。如果您是从活动中调用此方法,而不是从片段中调用此方法,则始终可以使用
this
作为活动的关键字(如果您还不知道的话)。我不明白你的第一个问题