为View使用某种“外部ID”

时间:2009-12-19 21:49:10

标签: android

我写了一个基于ViewSwitcher的View类,现在我想为视图编写帮助类,如已知的ListView:ListAdapter,ListActivity等等。

关于活动类,我遇到了一个问题。 ListActivity强制您使用固定ID:@ id / android:list将ListView添加到您的活动中。在我的基本活动类中,我希望将其归档,强制使用特殊的id,以便我的帮助程序类可以访问视图对象。

由于我正在编写可以在各种项目中使用的通用库,因此我无法使用R.id.foobar来获取视图,因为没有R类。具体项目将是一个自己的R.java。

所以我偷看了ListActivity的源代码,发现:

View emptyView = findViewById(com.android.internal.R.id.empty);
mList = (ListView)findViewById(com.android.internal.R.id.list);
if (mList == null) {
    throw new RuntimeException(
        "Your content must have a ListView whose id attribute is " +
        "'android.R.id.list'");
}

好的,我可以在R类上写一下,把它直接放到我的包中,然后尝试以相同的方式访问它,但我不知道id应该具有或需要什么值?

另外我在android_frameworks_base / core / java / com / android / internal

中找不到任何R类

即使这个问题得到解决:我的lib用户如何从他的布局XML访问“我的id”?

感谢您的帮助! :)

3 个答案:

答案 0 :(得分:0)

我不认为这是安全的,因为Android没有提供具有ID范围的可重复使用的窗口小部件作者,可用于您的目的。

相反,请执行以下操作之一:

  1. 让您的小部件的重新使用者传递相应的ID。
  2. 在给定名称的字符串形式的情况下,使用Resources#getIdentifier()R.*“命名空间中查找ID。如果你走这条路线,一定要缓存这个结果,因为它看起来有点贵。

答案 1 :(得分:0)

如果您正在创建其他应用程序可以使用的库APK,则此库的使用者无法在XML布局中引用其资源ID。

启动Android应用程序时,它会加载并缓存来自应用程序APK(resources.arsc)的资源信息,以及系统资源(即android.R中的那些资源)。 您的应用程序在单独的进程中运行,并且作为不同的用户ID,无法直接从其他APK中读取资源。

但是,如果您只是出于自己的目的使用该库,则应该能够通过使用相同的密钥对其进行签名或在清单中指定相同的进程ID来获得更高级别的访问权限。

答案 2 :(得分:0)

你可以通过URI引用ContentProvider提供的原始资源,我读取了一个ContentProvider提供的Zips中的Jpeg,用户在单独的apk中下载。

uri就像是

android.resource://name.of.component/r_file_id

然后ContentProvider可以将相应的资源文件标识返回给调用应用程序,然后它可以通过URI访问该文件。

编辑:可能需要使用相同的密钥