【问题标题】:Return a list of component ID's from an activity in android?从android中的活动返回组件ID列表?
【发布时间】:2016-08-04 12:24:38
【问题描述】:

我正在整理一个小型 android 库,供其他开发人员在他们的 android 应用程序中使用。第 3 方开发人员会将我的自定义按钮(例如 "com.example.myLibrary.CustomButton")添加到他们的 xml 视图中。 开发人员可以根据需要放入任意数量的这些按钮。

我的库代码有没有办法识别 Activity 中有多少个这些自定义按钮,然后返回它们的 ID(可能是应用开发者设置的任何内容)?

我已经尝试过int[] i = getResources().getIdentifier("name","component","package");,但它返回一个 6 位整数,我认为这是组件的一些系统标识符,而不是它的每个实例。

注意 -- 我知道库需要通过new MyLibrary(context); 之类的方式传递应用程序活动的上下文来传递应用程序活动的上下文。我已经为图书馆的其他方面实现了这一点,因此这似乎不是问题。

非常感谢您提出任何可以帮助解决该问题的建议

【问题讨论】:

    标签: android android-library identifier custom-component


    【解决方案1】:

    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());
            }
        }
    }
    

    【讨论】:

    • 尼克。非常感谢您澄清我收到的整数是 ID 的系统级整数以及如何在视图组中获取组件 - 但如果我不知道 integer ID@+id/idName 如果你知道,这是否有效我的意思是说。开发人员将添加自定义组件 x 次并为其添加任何 ID 名称。只是一个想法,但也许有更好的方法来解决这个问题?也许库应该以编程方式将 ID 分配给自定义按钮的每个实例?干杯
    • 尼克。它与我一起动摇了你在做什么,我得到了你的解决方案!我只需要将父活动上下文添加到您的ViewGroup viewGroup = (ViewGroup) activityContext.getWindow().getDecorView(); 行中,然后我就能够为特定的 UI 组件生成 ID 整数的 ArrayList。非常感谢!
    • 太棒了!很高兴你被理顺了。我将编辑我的答案以反映这一点。如果您在活动中而不是片段中调用此方法,则始终可以使用this 作为活动的关键字(以防您还不知道)。我不明白您关于以编程方式分配 ID 的第一个问题?我尝试在以编程方式指定 ID 之前,API 17 添加了一个 generateViewID() 方法,如果这是你所要求的,它将确保你得到一个唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多