7

因此,我的代码使用 AtomicInteger 为许多元素生成 ID,该 AtomicInteger 默认设置为 Integer.MAX_VALUE,并随着每个视图分配一个 ID 从那里递减。所以第一个生成ID的视图是Integer.MAX_VALUE - 1,第二个是Integer.MAX_VALUE - 2,等等。我担心的问题是与Android在R.java中生成的ID发生冲突。

所以我的问题是如何检测一个 ID 是否已被使用并在生成 ID 时跳过它。我最多只生成 30 个 ID,所以这不是一个重要的优先事项,我想让它尽可能地没有错误。

4

5 回答 5

8

以下代码将告诉您标识符是否为 id。

static final String PACKAGE_ID = "com.your.package.here:id/"
...
...
int id = <your random id here>
String name = getResources().getResourceName(id);
if (name == null || !name.startsWith(PACKAGE_ID)) {
    // id is not an id used by a layout element.
}
于 2012-04-29T11:13:50.230 回答
4

我从上面修改了 Jens 的答案,因为正如评论中所述,name 永远不会为 null,而是抛出异常。

private boolean isResourceIdInPackage(String packageName, int resId){
    if(packageName == null || resId == 0){
        return false;
    }

    Resources res = null;
    if(packageName.equals(getPackageName())){
        res = getResources();
    }else{
        try{
            res = getPackageManager().getResourcesForApplication(packageName);
        }catch(PackageManager.NameNotFoundException e){
            Log.w(TAG, packageName + "does not contain " + resId + " ... " + e.getMessage());
        }
    }

    if(res == null){
        return false;
    }

    return isResourceIdInResources(res, resId);
}

private boolean isResourceIdInResources(Resources res, int resId){

    try{            
        getResources().getResourceName(resId);

        //Didn't catch so id is in res
        return true;

    }catch (Resources.NotFoundException e){
        return false;
    }
}
于 2015-02-02T23:11:23.647 回答
1

您可以使用Java 反射 APIR.id来访问Class对象中存在的任何元素。

代码是这样的:

Class<R.id> c = R.id.class;

R.id object = new R.id();

Field[] fields = c.getDeclaredFields();

// Iterate through whatever fields R.id has
for (Field field : fields)
{
    field.setAccessible(true);

    // I am just printing field name and value, you can place your checks here

    System.out.println("Value of " + field.getName() + " : " + field.get(object));
}
于 2012-04-29T08:30:17.890 回答
1

您可以使用View.generateViewId()需要最低 API 17 的版本。

来自sdk

生成适合在 setId(int) 中使用的值。此值不会与 aapt for R.id 在构建时生成的 ID 值冲突。

于 2020-11-27T13:30:43.217 回答
0

只是一个想法...您可以使用findViewById (int id)来检查是否id已在使用中。

于 2012-04-29T08:05:07.247 回答