7

したがって、デフォルトでInteger.MAX_VALUEに設定され、IDが割り当てられるビューごとにそこからデクリメントされるAtomicIntegerを使用して、いくつかの要素のIDを生成するコードがあります。したがって、生成されたIDを持つ最初のビューはInteger.MAX_VALUE - 1、2番目はInteger.MAX_VALUE - 2、などになります。私が恐れている問題は、R.javaでAndroidによって生成された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

コメントで述べられているように、名前がnullになることはなく、代わりに例外がスローされるため、上記のJensの回答を変更しました。

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 Reflection APIを使用して、 R.idClassのオブジェクトに存在する要素にアクセスできます。

コードは次のようになります。

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()最小API17が必要なものを使用できます。

SDKから

setId(int)での使用に適した値を生成します。この値は、ビルド時にaaptforR.idによって生成されたID値と衝突しません。

于 2020-11-27T13:30:43.217 に答える
0

ただのアイデア...を使用して、がすでに使用されているfindViewById (int id)かどうかを確認できます。id

于 2012-04-29T08:05:07.247 に答える